这里首先介绍几个概念:BIO——同步阻塞IO、NIO——同步非阻塞IO、AIO——异步非阻塞IO
今天的例子是最简单的一个例子,没有引入多线程,仅仅是一个单线程阻塞的Socket例子,多线程的下次再继续。
这样子的例子仅仅供学习使用,基本上是没有实用意义的,因为在实际的应用中基本上是不止于一个Client的。
Server端得代码如下:
package com.henushang.socket; import java.io.BufferedReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import com.henushang.socket.util.SocketUtils; public class EchoServer { private int port = 8000; private ServerSocket serverSocket; public EchoServer() throws Exception { serverSocket = new ServerSocket(port); System.out.println("waitting connet..."); } public String echo(String msg) { return "echo:" + msg; } public void service() { Socket socket = null; String msg = null; while (true) { try { socket = serverSocket.accept();// 准备接受连接 System.out.println("new connection: " + socket.getInetAddress() + ":" + socket.getPort()); BufferedReader reader = SocketUtils.getReader(socket);// 输入流 PrintWriter writer = SocketUtils.getWriter(socket);// 输出流 while ((msg = reader.readLine()) != null) {// 接收消息 System.out.println(msg); writer.println(echo(msg));// 发送消息 writer.flush();// 注意,在使用缓冲流在发送消息的时候最好进行强制刷新,否则,可能会由于缓冲区不满而暂时不发送消息 if ("bye".equals(msg)) { break; } } } catch (Exception e) { e.printStackTrace(); }finally { SocketUtils.close(socket); } } } public static void main(String[] args) { try { new EchoServer().service(); } catch (Exception e) { e.printStackTrace(); } } }
客户端代码:
package com.henushang.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import com.henushang.socket.util.SocketUtils; public class EchoClient { private String host = "127.0.0.1"; private int port = 8000; private Socket socket ; public EchoClient() throws Exception { socket = new Socket(host, port); } public void talk() throws IOException { try { BufferedReader reader = SocketUtils.getReader(socket); PrintWriter writer = SocketUtils.getWriter(socket); // 读取本地控制台的消息 BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg = null; while ((msg = localReader.readLine()) != null) { writer.println(msg); writer.flush(); System.out.println(reader.readLine()); if ("bye".equals(msg)) { break; } } } catch (Exception e) { e.printStackTrace(); }finally { SocketUtils.close(socket); } } public static void main(String[] args) throws Exception{ new EchoClient().talk(); } }
下面是我写的一个工具类,做了一些重复的操作的汇集,如下:
package com.henushang.socket.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.nio.channels.SocketChannel; public class SocketUtils { public static PrintWriter getWriter(Socket socket) throws IOException { OutputStream os = socket.getOutputStream(); return new PrintWriter(os); } public static PrintWriter getWriter(SocketChannel socketChannel) throws IOException { return getWriter(socketChannel.socket()); } public static BufferedReader getReader(Socket socket) throws IOException{ InputStream is = socket.getInputStream(); return new BufferedReader(new InputStreamReader(is, "UTF-8")); } public static BufferedReader getReader(SocketChannel socketChannel) throws IOException{ return getReader(socketChannel.socket()); } public static void close(Socket socket) { try { if (socket != null) { socket.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void close(SocketChannel socketChannel) { try { if (socketChannel != null) { socketChannel.close(); } } catch (Exception e) { e.printStackTrace(); } } }
参考:《java网络编程精解》
相关推荐
本教程将深入探讨如何使用Java Socket实现一个简单的单聊系统,包括客户端(ChatSocketClient)和服务器端(ChatSocketAndroid)的创建。 首先,我们需要理解Java Socket的基本概念。Socket是网络通信中的一个端点...
通过这个Java项目,我们可以学习如何使用Java原生SDK实现Socket通信,理解单线程和多线程在并发处理上的优缺点,以及如何根据实际需求选择合适的通信模型。同时,该项目还可以作为进一步研究高级网络编程、线程管理...
这种方式避免了单线程模型中,一个客户端的阻塞会导致其他客户端无法服务的问题。此外,线程池的使用也使得资源的分配更加合理,提高了系统的整体性能。 总结来说,这个学习笔记提供了一个使用Java Socket编程实现...
学习和理解这个多线程Socket服务端代码可以帮助开发者更好地设计和实现高性能的网络服务,例如聊天服务器、文件传输服务或在线游戏服务器。同时,这也有助于理解并发编程和网络通信的基本原理,这些都是成为一名优秀...
这个学习资源可以帮助我们深入了解Java中的TCP Socket编程和多线程技术。 首先,让我们来看看TCP协议。TCP是一种面向连接的、可靠的传输协议,它保证了数据包在传输过程中的顺序和完整性。通过三次握手建立连接,四...
在Java编程中,Socket通信是...总结起来,实现Java Socket收发数据及断网自动连接涉及了Socket的基本使用、异常处理、重连策略、心跳机制和线程管理等多个方面。在实际应用中,需要根据具体需求进行灵活设计和优化。
这份“JAVA电子教案------入门级java学习资料”是为初学者精心准备的学习资源,旨在帮助那些刚开始接触Java的人快速理解其基本概念和语法。 在Java的世界里,首先要了解的是它的三大特性:封装、继承和多态。封装是...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本项目"java多线程实现-tcp端口扫描"中,我们利用多线程技术来加速TCP端口扫描的过程。TCP(Transmission Control Protocol...
我们可以创建一个线程池或者为每个新连接创建一个新的线程,这样每个线程都可以独立处理与特定客户端的通信,避免了单线程模型下的阻塞问题。同时,客户端也可以使用多线程来并行接收和发送消息,提高用户体验。 在...
在高并发环境下,如果服务器使用单线程处理请求,那么在处理一个连接时其他连接必须等待,这会导致性能瓶颈。通过使用多线程,服务器可以同时处理多个连接,每个连接由一个独立的线程负责。然而,当并发数超过一定...
Java Socket服务器客户端程序是网络编程中的基础组件,用于实现两台计算机之间的通信。Socket编程是Java提供的一个标准接口,它允许应用程序通过网络发送和接收数据。在这个程序中,我们将探讨以下几个核心知识点: ...
本项目是一个自己编写的Java多线程Socket服务端,能够接收来自网络调试助手或其他客户端的数据。 首先,我们需要理解Java Socket的基本概念。Socket是网络上的两个进程间通信的端点,就像电话线两端的电话一样。在...
在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...
综上所述,Java Socket单线程通信是网络编程的基础,通过这个课程设计,可以深入理解TCP连接的建立、数据的双向传输以及异常处理等关键概念。实际项目开发中,通常会采用多线程或者NIO(非阻塞I/O)技术来提高服务端...
Java Socket Server 机器人是一种利用Java编程语言实现的网络通信服务,它基于Socket接口来构建。Socket在计算机网络中扮演着客户端和服务端之间的桥梁角色,允许两者进行双向数据传输。在这个项目中,Java Socket ...
在Java中,`ServerSocket`类用于创建服务器端的Socket,它会阻塞等待直到有客户端连接。一旦连接建立,`Socket`类则用于表示客户端与服务器间的连接,并提供了输入流和输出流,供双方进行数据交换。例如,服务器端...
总的来说,这个简单的文件传输程序利用了Java Socket API实现了客户端和服务器之间的文件交换,虽然它可能没有涵盖高级特性,如断点续传、错误恢复或性能优化,但对于理解和学习Socket编程基础是很有帮助的。...
总的来说,Java Socket开发高并发小型服务器涉及到网络通信的基本原理、Java语言的网络编程接口、多线程技术以及服务器性能优化等多个方面,是Java开发者需要掌握的重要技能。通过深入理解和实践,开发者可以构建出...