public class Client { /**
* 程序主类,创建Socket并连接至指定服务器
**/
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 5785); //服务器IP地址,端口
DataInputStream is = new DataInputStream(s.getInputStream()); //创建数据输入流
DataOutputStream os = new DataOutputStream(s.getOutputStream()); //创建数据输出流
System.out.println("Input your message here: "); //打印提示字符
String outStr, inStr;
boolean NotExit = true;
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); //创建缓冲方式读取
while (NotExit) {
outStr = buf.readLine(); //从输入流中读取数据
os.writeUTF(outStr); //向服务器发送数据
os.flush(); //清空缓冲区数据
inStr = is.readUTF(); //读取输入流即服务器返回的结果
if (!inStr.equals("exit")) { //如果消息内容不是“exit”
System.out.println("Server Return: " + inStr); //打印服务器返回消息
} else {
NotExit = false; //跳出循环
System.out.println("Server Return: " + inStr + " and close the connection."); //打印断开连接消息
}
}
is.close(); //关闭输入流
os.close(); //关闭输出流
s.close(); //关闭socket
} catch (ConnectException ex) {
System.err.println("Failed to connect to server, connect refused."); //连接失败时打印错误信息
} catch (SocketException es) {
System.err.println("Failed to send message, connect reset."); //连接被重置时打印错误信息
} catch (IOException e) {
System.err.println(e); //发生IO错误时打印错误信息
}
}
}
服务端代码 (MultiServer.java):
package com.prismaillya;
import java.io.*;
import java.net.*;
public class MultiServer {
/**
* 服务器主类,负责启动服务器线程
**/
public static void main(String[] args) throws IOException {
System.out.println("Wait for connect......");
ServerSocket serverSocket = new ServerSocket(5785); //创建Socket,5785 是你要绑定的端口,需要和客户端相同
Socket s = null;
while (true) {
s = serverSocket.accept(); //开始接受客户端请求
ServerThread serverThread = new ServerThread(s); //创建服务器线程
}
}
}
服务端核心代码(ServerThread.java):
package com.prismaillya;
import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
private final Socket s;
private final DataInputStream is;
private final DataOutputStream os;
public ServerThread(Socket socket) throws IOException {
super(); //调用父类构造函数
s = socket;
is = new DataInputStream(s.getInputStream()); //创建数据输入流
os = new DataOutputStream(s.getOutputStream()); //创建数据输出流
start(); //启动线程
}