TCP Socket

例  客戶端如何連接服務器

public class TestTCPServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666);//要指明服務器的端口號
Socket s = ss.accept();//s指服務器與這一個客戶端的Socket連接
System.out.println("A Client Connect!");
}
}


public class TestTCPClient {

public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",6666);//指明服務器的IP地址和端口號
}

}


先運行Server,再運行Client。

Server Console

A Client Connect!


服務器程序往往是和客戶端程序一起開發的。


客戶端現在已經連接上了服務器,那如何通信呢?

使用流!


例  客戶端向服務器發送消息

public class TestTCPServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();//不停的處於接收狀態
System.out.println("A Client Connect!");

//一個Socket包含了兩個管道,一個輸入一個輸出。
//拿到輸入管道,定義爲DataInputStream類型
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
dis.close();
s.close();
}
}


public class TestTCPClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",6666);
//通過getOutputStream()來拿到輸出管道,並定義爲DataOutputStream類型
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
Thread.sleep(5000);//使當前線程睡5s,以實驗readUTF()是否阻塞,是否等待。
dos.writeUTF("Hello Server.");
dos.flush();//刷新輸出流
dos.close();
s.close();
}
}

先運行Server,再運行Client。

Server Console

A Client Connect!
Hello Server.


其中,ss.accept()和readUTF()都是阻塞式的,如果沒有數據來,就一直死死等着。

並不是讀不到東西就往下運行。

但是線程就被堵住了。


例  服務器向客戶端發送消息

public class TestTCPServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();
System.out.println("A Client Connect!");

DataOutputStream dos = new DataOutputStream(s.getOutputStream());

//.getInetAddress()可以拿到客戶端的IP地址,.getPort()拿到客戶端端口號。
dos.writeUTF("Hello," + s.getInetAddress() + " port#" + s.getPort() + ".");
dos.close();
s.close();
}
}


public class TestTCPClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",6666);
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
dis.close();
s.close();
}
}

Client Console

Hello,/127.0.0.1 port#2094.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章