初学socket,写了个回显服务器,旨在熟悉一下原理和api。
package in.sikaijian.socket.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
/**
* 回显服务器
* @author sikaijian
*/
public class EchoServer {
private ServerSocket server;
/**
* 构造,端口初始化
* @param port
* @throws Exception
*/
public EchoServer(int port) throws Exception{
this.server = new ServerSocket(port);
}
/**
* 启动服务器
*/
public void startUp(){
System.out.println("----echo server start----");
System.out.println("listening on port : " + this.server.getLocalPort() + "...");
/**
* ServerSocket的accept方法会一直阻塞直到有新的socket连接
* 接受到新的连接后,启动一个线程来处理
* 线程启动后,继续进入while循环,accept仿佛继续阻塞
*/
while(true){
try {
Socket client = this.server.accept();
Thread servThread = new Thread(new EchoThread(client));
servThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 服务线程实现
* @author sikaijian
*/
private class EchoThread implements Runnable{
private Socket client;
public EchoThread(Socket client){
this.client = client;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
System.out.println("----------------------------");
System.out.println("request socket address : " + client.getRemoteSocketAddress());
System.out.println("doing service...");
// 循环读,直到出现异常,认为是客户端关闭socket连接
while(true){
try {
String line = reader.readLine();
out.println(line);
out.flush();
System.out.println("From client : " + line);
} catch (SocketException e) {
if(client!=null){
client.close();
}
System.out.println("----------------------------");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
EchoServer echo = new EchoServer(18088);
echo.startUp();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package in.sikaijian.socket.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客户端,连接回显服务器,循环发送字符串
* @author sikaijian
*/
public class EchoClient {
public static void main(String[] args) {
String host = "localhost";
PrintWriter out = null;
BufferedReader netWorkIn = null;
try {
Socket theSocket = new Socket(host, 18088);
netWorkIn = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(theSocket.getOutputStream()));
BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("----Connect to echo server---");
System.out.println("Try to type something....");
while(true){
String line = userIn.readLine();
if(line.equals("exit")) break;
out.println(line);
out.flush();
System.out.println("echo : " + netWorkIn.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

本文详细介绍了使用Java实现socket通信的基本原理和API应用,通过构建一个回显服务器和相应的客户端,旨在帮助初学者快速理解socket通信的工作机制及其实现过程。
1504

被折叠的 条评论
为什么被折叠?



