利用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();}
}
}
}