初学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编程涉及到的主要类和接口存在于`java.net`包中。 1. **ServerSocket**:在服务器端,你需要创建一个`ServerSocket`实例来监听特定端口上的连接请求。例如,`new ServerSocket(6789)`会打开6789...
1. **简单回显服务器**:这个例子展示了最基本的ServerSocket和Socket的使用。服务器端创建ServerSocket并监听一个端口,当客户端连接时,服务器接收客户端发送的数据并原样返回。客户端使用Socket连接服务器,发送...
1. **Socket编程**:`java.net.Socket`类用于创建客户端连接,`java.net.ServerSocket`类用于服务器监听连接请求。 2. **多线程**:通过创建新的`Thread`实例,每个客户端连接都被分配到独立的线程中,确保服务器...
Java Socket编程实现UDP网络测试是计算机网络领域中的一个重要实践,主要涉及到Java编程语言以及网络通信协议UDP(User Datagram Protocol)。Socket在计算机网络中扮演着桥梁的角色,它允许应用程序通过网络发送和...
通过对`EchoServer.java`、`SocketUtils.java`和`EchoClient.java`的分析,我们可以深入理解Java Socket编程以及多线程阻塞模式在实际应用中的实现。这对于开发网络应用程序,尤其是需要处理大量并发连接的服务端...
Java Socket编程是网络编程中的重要一环,它允许两台机器上的应用程序通过网络进行通信。在本案例中,我们讨论的是一个基于Java Socket实现的简单客户端-服务器(C/S)架构的聊天程序,名为"java1-echo.rar_java ...
Socket编程是计算机网络编程中的重要组成部分,特别是在Java中,它为开发者提供了在不同网络设备间交换数据的能力。本文将深入探讨Linux环境下使用Java进行Socket编程的相关知识点。 首先,Socket是网络通信中的一...
SimpleEchoServer是一个基于Java编程语言实现的简易回显服务器。在计算机网络中,回显服务器是一种常见的服务,它接收客户端发送的数据,并原封不动地返回给客户端,主要用于测试网络连接和协议。这个项目提供了一个...
综上所述,Java Socket编程涉及到网络连接的建立、数据的传输以及通信的结束。在实际应用中,可能需要考虑异常处理、多线程(处理多个客户端连接)以及更复杂的数据格式化。理解和掌握Socket编程对于开发分布式系统...
1. **Socket编程**:Socket是TCP/IP网络上的应用程序之间进行双向通信的端点。客户端通过创建Socket实例连接到服务器的特定端口,而服务器则使用ServerSocket监听特定端口的连接请求。一旦连接建立,双方就可以通过...
04-TCP-Echo和05-Multithread-TCP-Echo都是实现TCP回显服务器的例子。回显服务器接收到客户端发送的数据后,原样返回,用于测试网络连接和协议栈。在05-Multithread-TCP-Echo中,多线程技术被用来处理并发的客户端...
Java Socket编程实例(一)展示了如何使用Java实现TCP协议的简单回显服务器和客户端。服务端通过`ServerSocket`监听端口,接收并回显客户端的数据,而客户端则创建Socket连接,发送数据并等待服务器的回应。这种模式...
TCP Socket通信是Java网络编程的核心部分,涉及到`ServerSocket`和`Socket`类。在提供的代码中,服务器端使用`ServerSocket`创建一个监听特定端口(8888)的服务,等待客户端的连接请求。 - **服务端流程**: - ...
这些文件是针对一个名为"ssd8 ex1"的编程练习的解答,主要涉及网络编程中的回显服务器(Echo Server)和客户端(Echo Client)的实现。在这个练习中,我们通常会看到如何使用Java语言来创建这样的服务器和客户端,...
在Java编程领域,Socket是网络通信的基础,它允许两个或多个应用程序通过TCP/IP协议进行数据交换。本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们...
从整体上看,本书覆盖了Java Socket编程的各个方面,从基础知识到进阶技巧,再到NIO模型的应用,内容丰富、结构清晰,是一本不错的Java网络编程学习资源。通过系统地学习和实践,读者可以掌握Java Socket编程的核心...
Java Socket编程中的UDP(用户数据报协议)是一种无连接、不可靠的数据传输方式,适合于对实时性要求较高的场景,如视频会议、在线游戏等。本篇将详细讲解如何在Java中实现UDP服务端和客户端的基本操作。 一、...
在上述题目中,展示了Server端和Client端的Socket编程实例。Server端创建一个ServerSocket监听特定端口(10000),等待客户端连接。当有客户端连接时,读取客户端发送的数据并回显。Client端则通过Socket连接到...