`
一帆过海
  • 浏览: 16201 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java Socket编程之回显服务器

阅读更多

初学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中,Socket编程涉及到的主要类和接口存在于`java.net`包中。 1. **ServerSocket**:在服务器端,你需要创建一个`ServerSocket`实例来监听特定端口上的连接请求。例如,`new ServerSocket(6789)`会打开6789...

    java socket通讯程序源码

    1. **简单回显服务器**:这个例子展示了最基本的ServerSocket和Socket的使用。服务器端创建ServerSocket并监听一个端口,当客户端连接时,服务器接收客户端发送的数据并原样返回。客户端使用Socket连接服务器,发送...

    Java基于Socket实现简单的多线程回显服务器功能示例

    1. **Socket编程**:`java.net.Socket`类用于创建客户端连接,`java.net.ServerSocket`类用于服务器监听连接请求。 2. **多线程**:通过创建新的`Thread`实例,每个客户端连接都被分配到独立的线程中,确保服务器...

    Java Socket编程实现UDP网络测试

    Java Socket编程实现UDP网络测试是计算机网络领域中的一个重要实践,主要涉及到Java编程语言以及网络通信协议UDP(User Datagram Protocol)。Socket在计算机网络中扮演着桥梁的角色,它允许应用程序通过网络发送和...

    Java Socket学习---多线程阻塞

    通过对`EchoServer.java`、`SocketUtils.java`和`EchoClient.java`的分析,我们可以深入理解Java Socket编程以及多线程阻塞模式在实际应用中的实现。这对于开发网络应用程序,尤其是需要处理大量并发连接的服务端...

    java1-echo.rar_java socket ec

    Java Socket编程是网络编程中的重要一环,它允许两台机器上的应用程序通过网络进行通信。在本案例中,我们讨论的是一个基于Java Socket实现的简单客户端-服务器(C/S)架构的聊天程序,名为"java1-echo.rar_java ...

    Socket编程示例(JAVA)

    Socket编程是计算机网络编程中的重要组成部分,特别是在Java中,它为开发者提供了在不同网络设备间交换数据的能力。本文将深入探讨Linux环境下使用Java进行Socket编程的相关知识点。 首先,Socket是网络通信中的一...

    SimpleEchoServer:一个用Java编写的简单回显服务器

    SimpleEchoServer是一个基于Java编程语言实现的简易回显服务器。在计算机网络中,回显服务器是一种常见的服务,它接收客户端发送的数据,并原封不动地返回给客户端,主要用于测试网络连接和协议。这个项目提供了一个...

    java_socket服务端和客户端编程

    综上所述,Java Socket编程涉及到网络连接的建立、数据的传输以及通信的结束。在实际应用中,可能需要考虑异常处理、多线程(处理多个客户端连接)以及更复杂的数据格式化。理解和掌握Socket编程对于开发分布式系统...

    JAVA网络编程基础案例

    1. **Socket编程**:Socket是TCP/IP网络上的应用程序之间进行双向通信的端点。客户端通过创建Socket实例连接到服务器的特定端口,而服务器则使用ServerSocket监听特定端口的连接请求。一旦连接建立,双方就可以通过...

    java 网络编程 代码集合

    04-TCP-Echo和05-Multithread-TCP-Echo都是实现TCP回显服务器的例子。回显服务器接收到客户端发送的数据后,原样返回,用于测试网络连接和协议栈。在05-Multithread-TCP-Echo中,多线程技术被用来处理并发的客户端...

    Java Socket编程实例(一)- TCP基本使用

    Java Socket编程实例(一)展示了如何使用Java实现TCP协议的简单回显服务器和客户端。服务端通过`ServerSocket`监听端口,接收并回显客户端的数据,而客户端则创建Socket连接,发送数据并等待服务器的回应。这种模式...

    java练习题-网络编程

    TCP Socket通信是Java网络编程的核心部分,涉及到`ServerSocket`和`Socket`类。在提供的代码中,服务器端使用`ServerSocket`创建一个监听特定端口(8888)的服务,等待客户端的连接请求。 - **服务端流程**: - ...

    ssd8 ex1EchoServer.java EchoClient.java ThreadEchoServer.java

    这些文件是针对一个名为"ssd8 ex1"的编程练习的解答,主要涉及网络编程中的回显服务器(Echo Server)和客户端(Echo Client)的实现。在这个练习中,我们通常会看到如何使用Java语言来创建这样的服务器和客户端,...

    Java Socket学习---nio实现阻塞多线程通信

    在Java编程领域,Socket是网络通信的基础,它允许两个或多个应用程序通过TCP/IP协议进行数据交换。本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们...

    javaSocket.pdf

    从整体上看,本书覆盖了Java Socket编程的各个方面,从基础知识到进阶技巧,再到NIO模型的应用,内容丰富、结构清晰,是一本不错的Java网络编程学习资源。通过系统地学习和实践,读者可以掌握Java Socket编程的核心...

    Java Socket编程实例(二)- UDP基本使用

    Java Socket编程中的UDP(用户数据报协议)是一种无连接、不可靠的数据传输方式,适合于对实时性要求较高的场景,如视频会议、在线游戏等。本篇将详细讲解如何在Java中实现UDP服务端和客户端的基本操作。 一、...

    名企java笔试编程题(最经典、最全面的java面试时的编程题)

    在上述题目中,展示了Server端和Client端的Socket编程实例。Server端创建一个ServerSocket监听特定端口(10000),等待客户端连接。当有客户端连接时,读取客户端发送的数据并回显。Client端则通过Socket连接到...

Global site tag (gtag.js) - Google Analytics