Java Socket 多线程
服务端代码:
package yang.socket.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class ServerThreadCode extends Thread{
// 客户端的socket,用来接受客户端的socket
public Socket clientSocket;
public BufferedReader sockin;
public PrintWriter sockout;
public ServerThreadCode(Socket socket) throws IOException{
this.clientSocket = socket;
System.out.println("Message from: " + clientSocket);
}
// 线程执行的主体函数
public void run(){
try {
sockin = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sockout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())),true);
while (true) {
String str = sockin.readLine();
System.out.println("Server reveived message: " + str);
sockout.println(str + " Has received");
if (str.equals("end")) {
break;
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally{
try {
System.out.println("closing the server socket!" + clientSocket);
clientSocket.close();
sockin.close();
sockout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class ThreadServer {
public static void main(String[] args) throws IOException {
int port = 3333;
ServerSocket server=new ServerSocket(port);
System.out.println("服务器正在运行。。。。");//一直运行不会停止
while(true){
ServerThreadCode serverSample = new ServerThreadCode(server.accept());
serverSample.start();
}
}
}
客户端代码:
package yang.socket.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.Socket;
class ClientThreadCode extends Thread{
public Socket socket;
public static int cnt = 0;
private int clientId = cnt++;
public BufferedReader in;
public PrintWriter out;
public ClientThreadCode(InetAddress addr, int port){
try {
socket = new Socket(addr, port);
System.out.println("Client socket is build" + socket);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
start();
} catch (IOException e1) {
e1.printStackTrace();
}
}
// 线程主体方法
public void run() {
try {
out.println("Hello Server, this is client " + clientId);
out.println("end");
String str = in.readLine();
System.out.println(str);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
System.out.println("Client " + clientId + " is closed!");
socket.close();
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class TnreadClient {
/**
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException {
// TODO Auto-generated method stub
int i = 0;
int port = 3333;
InetAddress addr = InetAddress.getByName("localhost");
for (i = 0; i < 3; i++){
new ClientThreadCode(addr, port);
}
}
}
测试场景:
服务器端:
服务器正在运行。。。。
Message from: Socket[addr=/127.0.0.1,port=55104,localport=3333]
Server reveived message: Hello Server, this is client 0
Server reveived message: end
closing the server socket!Socket[addr=/127.0.0.1,port=55104,localport=3333]
Message from: Socket[addr=/127.0.0.1,port=55105,localport=3333]
Server reveived message: Hello Server, this is client 1
Server reveived message: end
closing the server socket!Socket[addr=/127.0.0.1,port=55105,localport=3333]
Message from: Socket[addr=/127.0.0.1,port=55106,localport=3333]
Server reveived message: Hello Server, this is client 2
Server reveived message: end
closing the server socket!Socket[addr=/127.0.0.1,port=55106,localport=3333]
客户端:
Client socket is buildSocket[addr=localhost/127.0.0.1,port=3333,localport=55104]
Hello Server, this is client 0 Has received
Client 0 is closed!
Client socket is buildSocket[addr=localhost/127.0.0.1,port=3333,localport=55105]
Hello Server, this is client 1 Has received
Client 1 is closed!
Client socket is buildSocket[addr=localhost/127.0.0.1,port=3333,localport=55106]
Hello Server, this is client 2 Has received
Client 2 is closed!