java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信
Socket編程之簡單客戶端與服務器端通信
socket 通常用來實現客戶端和服務端的連接,socket 是Tcp/Ip協議的一個十分流行的編程界面,一個socket 由一個Ip地址和一個端口號唯一確定。但是,socket支持的協議種類不僅僅只有Tcp/Ip 一種,因此,兩者沒有必然聯系的。在Java 環境下,socket編程主要是基于Tcp/Ip協議的網絡編程.
1. Socket通信過程
Server端監聽某個端口是否有連接請求,Client端向服務端發送連接請求,服務端向客戶端發回接受信息。一個連接就建立起來了,服務端與客戶端就可以通過讀寫操作與對方進行通信了。
1)首先服務端創建serversocket監聽某一端口是否有客戶端的連接請求.
2)客戶端創建socket對象,指定ip 與端口號,向服務端發送連接請求.
3) 服務端監聽到連接請求,通過serversocket的accept()方法返回一個socket 對象建立連接.
4)服務端與客戶端利用socket的輸入輸出流,進行讀寫操作.
5)關閉socket.
這是服務器端的代碼,如下:
public class ClientTest {
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(2536); //定義一個ServerSocket監聽端口2536
Socket incoming = s.accept(); //服務器端嘗試獲取客戶端連接,服務器端產生一個socket
System.out.println("incoming come ");
BufferedReader in = new BufferedReader(new InputStreamReader(
incoming.getInputStream())); //通過socket獲取輸入流
PrintWriter out = new PrintWriter(incoming.getOutputStream(), true); //通過socket獲取輸出流
out.println("Hello! Enter BYE to exit.");//向客戶端發送此消息
boolean done = false;
Scanner scanner = new Scanner(System.in); //控制臺輸入
System.out.println("***********begin************");
while (!done) {
String line = in.readLine(); //讀取客戶端來信
System.out.println("來信:" + line);
String str = scanner.next();
if (line == null) {
done = true;
} else {
out.println(str); //向客戶端發送信息
if (line.trim().equals("BYE")) {
done = true;
}
}
}
incoming.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
客戶端代碼,如下:
public class Client {
public static void main(String args[]) {
try {
Socket connection= new Socket("192.168.126.68", 2536);
BufferedReader input = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
PrintWriter out = new PrintWriter(connection.getOutputStream(),true );
String info;
Scanner ss=new Scanner(System.in);
while (true) {
info = input.readLine();
System.out.println("來信: "+info);
String str=ss.next();
out.println(str);
System.out.println("發送:"+str);
}
connection.close();
}
catch (SecurityException e) {
System.out.println("SecurityException when connecting Server!");
}
catch (IOException e) {
System.out.println("IOException when connecting Server!");
}
}
}
常遇問題
1).服務端不只接受一個客戶端請求,而是會不斷的接受多個客戶端請求,如何處理?
可以利用循環不斷的調用ServerSocket的accept方法,
ServerSocket ss=new ServerSocket(3000);
while(true){
Socket s= ss.accept(); //每當接受客戶端請求,服務端都會產生一個socket
}2) . 如果服務端需要不斷讀取客戶端數據,并向客戶端寫入數據,客戶端需要不斷地讀取服務端數據,防止線程阻塞,如何處理?
當使用readLine方法讀取數據時候,如果在該方法成功返回之前線程被阻塞,則程序無法繼續執行,所以此服務端必要為每個socket單獨啟動一條線程,每個線程負責與一個客戶端進行通信. 同樣客戶端也需要單獨啟動一個線程,去讀取服務端的數據
private ArrayList socketlist=new ArrayList();
ServerSocket ss =new ServerSocket(30000);
while(true){
Socket s=ss.accept();
socketlist.add(s);
new Thread(new Serverxian(s)).start();
}
總結
以上是生活随笔為你收集整理的java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SYDTEK系列芯片低速PWM的三个模式
- 下一篇: SQL文件太大怎么打开(推荐一款工具Em