利用Java的Thread類,實現多個客戶端同時連接服務端。
客戶端:
/**
* Created by hades on 2017/3/16.
*/
import java.io.*;
import java.net.Socket;
public class EchoClient {
private String host = "localhost";
private int port = 8000;
private Socket socket;
public EchoClient() throws IOException {
socket = new Socket(host, port); //建立socket對象,用於與服務器的通信,需要綁定服務器端口。
}
private PrintWriter getWriter(Socket socket) throws IOException { //輸出流
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //輸入流
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk() throws IOException {
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while ((msg = localReader.readLine()) != null) {
pw.println(msg);
System.out.println(br.readLine());
if(msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
new EchoClient().talk();
}
}
服務端:
/**
* Created by hades on 2017/3/16.
*/
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
private int port=8000; //定義服務器連接端口
private ServerSocket serverSocket;
public EchoServer() throws IOException {
serverSocket = new ServerSocket(port); //新建serverSocket對象,綁定連接端口port
System.out.println("服務器啓動...");
}
public String echo(String msg) {
return "echo:" + msg;
}
public void service() throws IOException {
Socket socket=null;
try {
int count = 0;
while(true){
socket=serverSocket.accept();
//創建一個新的線程
ServerThread serverThread=new ServerThread(socket,count);
//啓動線程
serverThread.start();
count++;
System.out.println("客戶端" + count + "已連接");
System.out.println("當前客戶端的IP:" + socket.getInetAddress() + ":" + socket.getPort());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)
socket.close(); //斷開連接
}catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
new EchoServer().service();
}
}
多線程:
/**
* Created by hades on 2017/3/17.
*/
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerThread extends Thread{
Socket socket = null;
public ServerThread(Socket socket,int count) {
this.socket = socket;
}
public String echo(String msg) {
return "從服務端返回的消息:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException { //輸出流的建立
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //輸入流的建立
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void run(){
try {
BufferedReader br =getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye")) //如果客戶發送的消息爲“bye”,就結束通信
break;
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close(); //斷開連接
}catch (IOException e) {e.printStackTrace();}
}
}
}