兩個端點的建立連接后會有一個傳輸數據的通道,這通道稱為流,而且是建立在網絡基礎上的流,稱之為socket流。該流中既有讀取,也有寫入。
tcp的兩個端點:一個是客戶端,一個是服務端。
客戶端:對應的對象,Socket
服務端:對應的對象,ServerSocket
TCP客戶端:
①:建立tcp的socket服務,最好明確具體的地址和端口。這個對象在創建時,就已經可以對指定ip和端口進行連接(三次握手)。
②:如果連接成功,就意味着通道建立了,socket流就已經產生了。只要獲取到socket流中的讀取流和寫入流即可,只要通過getInputStream和getOutputStream就可以獲取兩個流對象。
③:關閉資源。
import java.net.*;
import java.io.*;
//需求:客戶端給服務器端發送一個數據。
class TcpClient{
public static void main(String[] args) throws Exception{
Socket s = new Socket("10.1.31.69",10002);
OutputStream out = s.getOutputStream();//獲取了socket流中的輸出流對象。
out.write("tcp演示,哥們又來了!".getBytes());
s.close();
}
}
TCP服務端:
①:創建服務端socket服務,並監聽一個端口。
②:服務端為了給客戶端提供服務,獲取客戶端的內容,可以通過accept方法獲取連接過來的客戶端對象。
③:可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。
④:如果通訊結束,關閉資源。注意:要先關客戶端,再關服務端。
我的總結:對於UDP和TCP,既可以定義輸出流也可以創建輸入流,具體情況根據需要構建;比如:我們需要客戶端給服務器端發送數據,服務器端再給客戶端反饋數據;那么就要在客戶端和服務器端分別多加一個輸入流和輸出流!否則,發不出去,收不到!
class TcpServer{
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(10002);//建立服務端的socket服務
Socket s = ss.accept();//獲取客戶端對象
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");//打印下作為連接上的標志
// 可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。
InputStream in = s.getInputStream();//讀取客戶端的數據,使用客戶端對象的socket讀取流
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
// 如果通訊結束,關閉資源。注意:要先關客戶端,在關服務端。
s.close();
ss.close();
}
}
備注:這個例子只是單方面的輸入!
Eg:雙向對話
客戶端:
package july76net;
//TCP雙向對話
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Demo10 {
public static void main(String[] args) throws Exception {
Socket s = new Socket("localhost",10036);
OutputStream out = s.getOutputStream();
out.write("你好,服務器!我是劉昭!".getBytes());
s.shutdownOutput();//注意!!!關閉標簽
InputStream is = s.getInputStream();
byte []buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
服務器端
package july76net;
//TCP雙向輸入輸出
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo11 {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10036);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"..........connected!");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
/*int len = in.read(buf);
System.out.println(new String(buf,0,len));*/
int len;
while((len = in.read(buf)) != -1){
System.out.println(new String(buf,0,len));
}
OutputStream os = s.getOutputStream();
os.write("劉昭你好!我是服務器!".getBytes());
s.close();
ss.close();
}
}