`

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

阅读更多

这里首先介绍几个概念: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网络编程精解》

 

 

 

0
0
分享到:
评论

相关推荐

    基于java socket的聊天-单聊

    本教程将深入探讨如何使用Java Socket实现一个简单的单聊系统,包括客户端(ChatSocketClient)和服务器端(ChatSocketAndroid)的创建。 首先,我们需要理解Java Socket的基本概念。Socket是网络通信中的一个端点...

    单线程与多线程socket通信

    通过这个Java项目,我们可以学习如何使用Java原生SDK实现Socket通信,理解单线程和多线程在并发处理上的优缺点,以及如何根据实际需求选择合适的通信模型。同时,该项目还可以作为进一步研究高级网络编程、线程管理...

    学习笔记:多线程Java Socket编程示例

    这种方式避免了单线程模型中,一个客户端的阻塞会导致其他客户端无法服务的问题。此外,线程池的使用也使得资源的分配更加合理,提高了系统的整体性能。 总结来说,这个学习笔记提供了一个使用Java Socket编程实现...

    socket-多线程-服务端代码

    学习和理解这个多线程Socket服务端代码可以帮助开发者更好地设计和实现高性能的网络服务,例如聊天服务器、文件传输服务或在线游戏服务器。同时,这也有助于理解并发编程和网络通信的基本原理,这些都是成为一名优秀...

    TCP-socket.zip_java_java Tcp _java socket _socket_socket多线程

    这个学习资源可以帮助我们深入了解Java中的TCP Socket编程和多线程技术。 首先,让我们来看看TCP协议。TCP是一种面向连接的、可靠的传输协议,它保证了数据包在传输过程中的顺序和完整性。通过三次握手建立连接,四...

    JAVA socket收发数据,并支持断网自动连接

    在Java编程中,Socket通信是...总结起来,实现Java Socket收发数据及断网自动连接涉及了Socket的基本使用、异常处理、重连策略、心跳机制和线程管理等多个方面。在实际应用中,需要根据具体需求进行灵活设计和优化。

    JAVA电子教案------入门级java学习资料

    这份“JAVA电子教案------入门级java学习资料”是为初学者精心准备的学习资源,旨在帮助那些刚开始接触Java的人快速理解其基本概念和语法。 在Java的世界里,首先要了解的是它的三大特性:封装、继承和多态。封装是...

    java多线程实现-tcp端口扫描

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本项目"java多线程实现-tcp端口扫描"中,我们利用多线程技术来加速TCP端口扫描的过程。TCP(Transmission Control Protocol...

    java socket 聊天系统

    我们可以创建一个线程池或者为每个新连接创建一个新的线程,这样每个线程都可以独立处理与特定客户端的通信,避免了单线程模型下的阻塞问题。同时,客户端也可以使用多线程来并行接收和发送消息,提高用户体验。 在...

    java socket多线程文件上传下载实例项目

    在高并发环境下,如果服务器使用单线程处理请求,那么在处理一个连接时其他连接必须等待,这会导致性能瓶颈。通过使用多线程,服务器可以同时处理多个连接,每个连接由一个独立的线程负责。然而,当并发数超过一定...

    java socket服务器客户端程序

    Java Socket服务器客户端程序是网络编程中的基础组件,用于实现两台计算机之间的通信。Socket编程是Java提供的一个标准接口,它允许应用程序通过网络发送和接收数据。在这个程序中,我们将探讨以下几个核心知识点: ...

    自己写的Java Socket服务端

    本项目是一个自己编写的Java多线程Socket服务端,能够接收来自网络调试助手或其他客户端的数据。 首先,我们需要理解Java Socket的基本概念。Socket是网络上的两个进程间通信的端点,就像电话线两端的电话一样。在...

    java,socket多线程一对一聊天

    在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...

    limengjie.zip_java socket _socket

    综上所述,Java Socket单线程通信是网络编程的基础,通过这个课程设计,可以深入理解TCP连接的建立、数据的双向传输以及异常处理等关键概念。实际项目开发中,通常会采用多线程或者NIO(非阻塞I/O)技术来提高服务端...

    java socket server 机器人

    Java Socket Server 机器人是一种利用Java编程语言实现的网络通信服务,它基于Socket接口来构建。Socket在计算机网络中扮演着客户端和服务端之间的桥梁角色,允许两者进行双向数据传输。在这个项目中,Java Socket ...

    Java Socket多人聊天室

    在Java中,`ServerSocket`类用于创建服务器端的Socket,它会阻塞等待直到有客户端连接。一旦连接建立,`Socket`类则用于表示客户端与服务器间的连接,并提供了输入流和输出流,供双方进行数据交换。例如,服务器端...

    java socket 简单的文件传输程序

    总的来说,这个简单的文件传输程序利用了Java Socket API实现了客户端和服务器之间的文件交换,虽然它可能没有涵盖高级特性,如断点续传、错误恢复或性能优化,但对于理解和学习Socket编程基础是很有帮助的。...

    Java_Socket开发高并发小型服务器

    总的来说,Java Socket开发高并发小型服务器涉及到网络通信的基本原理、Java语言的网络编程接口、多线程技术以及服务器性能优化等多个方面,是Java开发者需要掌握的重要技能。通过深入理解和实践,开发者可以构建出...

Global site tag (gtag.js) - Google Analytics