jav服务端-客户端Socket通信改进(多线程)

时间:2022-10-12 22:16:07
扩展的Socket通信实例:
上述程序,只能相应一个客户端的链接请求,在实际应用中,服务器一般需要相应多个客户端的请求,因此severeSocket对象的accept()方法每当有一个连接请求发生时,就会产生一个客户端的Socket对象.因此只要用此方法反复监听客户端请求 ,就会为每一个客户生成一个专用的Socketduixiang 进行通信.
下面是一个可实现一对多Socket通信的例子.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ServerThread extends Thread {

/**
* 服务器线程程序
*/

Socket s;
DataInputStream is;
DataOutputStream os;

// 在构造方法中为每个套接字链接输入输出流
public ServerThread(Socket socket) throws IOException {
super();// 调用父类的构造方法
s = socket;
// 获得对应的输入输出流
is = new DataInputStream(s.getInputStream());
os = new DataOutputStream(s.getOutputStream());
start();// 启动run()方法
}

// 在run()方法中与客户端进行通信,可以对接受到的客户端数据进行处理,并返回给客户端数据
public void run() {
String str;
double result, zhi;
boolean NotEnd = true;

try {
while (NotEnd) {
str = is.readUTF();
if (!str.equals("bye")) {
zhi = Double.parseDouble(str);
System.out.println("接收到的值为" + zhi);
result = zhi * zhi;
str = Double.toString(result);// 把double型的result转为String类型
os.writeUTF(str);
os.flush();// 清空缓冲区,立即发送
System.out.println("平方值" + str + "已发送!");
} else {
NotEnd = false;
os.writeUTF("bye");
os.flush();
}
}
os.close();
is.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}

}
}

服务端代码

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MultiServer {

/**
* @param args
*/

public static void main(String[] args) {
ServerSocket serverSocket;
Socket socket;
System.out.println("等待连接...");
try {
serverSocket=new ServerSocket(5500);//使用本地5500端口提供服务
while(true){
//等待客户端的请求
socket=serverSocket.accept();//返回一个客户端的socket,用这个socket连接相应的输入输出流(在ServerThread)
System.out.println("连接成功啦!");
//每次请求都启动一个线程来处理.
new ServerThread(socket);
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

客户端代码

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
public static void main(String[] args) {
//连接到服务端
try {
Socket socket=new Socket("localhost", 5500);
//将数据输入量连接到socket上
DataInputStream dis=new DataInputStream(socket.getInputStream());
//将数据输出流连接到socket上
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
System.out.println("输入待求平方值,输入bye结束!");
String outStr,instr;
boolean NotEnd=true;
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
//反复读用户的数据并计算
while(NotEnd){
outStr=bufferedReader.readLine();//读入用户的输入
//写入到socket中,让服务端接受姐可以了.可以理解为向服务端发送数据
dos.writeUTF(outStr);
//清空缓冲区,立即发送.
dos.flush();
//从socket中读取数据.即接受服务端的数据
instr=dis.readUTF();
if(!instr.equals("bye")){
System.out.println("返回结果:"+instr);
}else{
NotEnd=false;
}
}
dis.close();
dos.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}