`

[转]Java Socket实战之二 多线程通信

 
阅读更多

上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。具体代码如下:

package com.googlecode.garbagecan.test.socket.sample2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(10000);
		
		while (true) {
			Socket socket = server.accept();
			invoke(socket);
		}
	}
	
	private static void invoke(final Socket client) throws IOException {
		new Thread(new Runnable() {
			public void run() {
				BufferedReader in = null;
				PrintWriter out = null;
				try {
					in = new BufferedReader(new InputStreamReader(client.getInputStream()));
					out = new PrintWriter(client.getOutputStream());

					while (true) {
						String msg = in.readLine();
						System.out.println(msg);
						out.println("Server received " + msg);
						out.flush();
						if (msg.equals("bye")) {
							break;
						}
					}
				} catch(IOException ex) {
					ex.printStackTrace();
				} finally {
					try {
						in.close();
					} catch (Exception e) {}
					try {
						out.close();
					} catch (Exception e) {}
					try {
						client.close();
					} catch (Exception e) {}
				}
			}
		}).start();
	}
}

 下面是Client程序代码:

package com.googlecode.garbagecan.test.socket.sample2;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MyClient {
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("localhost", 10000);
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintWriter out = new PrintWriter(socket.getOutputStream());
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

		while (true) {
			String msg = reader.readLine();
			out.println(msg);
			out.flush();
			if (msg.equals("bye")) {
				break;
			}
			System.out.println(in.readLine());
		}
		socket.close();
	}
}

 测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。

分享到:
评论

相关推荐

    Java Socket实战之二 多线程通信 .

    我们将结合"Java Socket实战之二 多线程通信"这篇博文进行深入解析。 首先,了解Socket的基本概念。Socket在计算机网络中扮演着客户端与服务器之间通信的桥梁角色。它提供了低级别的、面向连接的、基于TCP/IP协议的...

    java socket tcpip多线程网络通信服务器客户端

    在“java socket tcpip多线程网络通信服务器客户端”这个主题中,我们将深入探讨如何使用Java Socket实现基于TCP/IP协议的多线程服务器和客户端通信。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的...

    Java代码写的局域网多线程TCP、Socket多人聊天室winsock.zip

    在本项目中,"Java代码写的局域网多线程TCP、Socket多人聊天室winsock.zip" 是一个基于Java实现的局域网多用户聊天应用。这个应用利用了TCP(Transmission Control Protocol)协议和Socket编程,同时采用了多线程...

    java socket 编程文档

    Java套接字编程是网络通信的核心技术之一,它允许Java应用程序之间或应用程序与远程服务器之间的双向数据传输。本文将深入探讨Java Socket编程的基础知识、关键概念以及如何在实践中应用。 一、Socket概述 Socket,...

    java socket 中文教程

    Java Socket是Java编程语言中用于网络通信的核心API,它提供了低级别的、面向连接的、基于TCP/IP协议的网络通信服务。本教程将深入探讨Java Socket的相关知识点,旨在帮助开发者理解和掌握如何在Java环境中构建网络...

    java+socket 及多线程线程池应用(IBM教程)

    通过实战,你可以学习到如何在实际项目中应用Java Socket、多线程和线程池,解决具体问题。 8. **最佳实践**:教程可能还会提供一些最佳实践建议,如如何设计健壮的并发系统,如何处理网络异常,以及如何利用线程池...

    javasocket多线程.pdf

    Java Socket 多线程编程 Java Socket 是 Java 语言中用于网络编程的 API,提供了基于 TCP/IP 协议的网络通信功能。在 Java 中,使用 Socket 编程可以实现客户端与服务器端之间的数据交换。今天,我们将学习使用 ...

    java Socket通信实现.zip

    Java Socket通信是网络编程中的基础概念,主要用于两台计算机之间的数据传输。Socket在Java中被封装为类,提供了客户端和服务器端进行双向通信的能力。在这个"java Socket通信实现.zip"的压缩包中,可能包含了关于...

    java socket 学习资料

    Java Socket是Java编程语言中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了低级别的网络连接功能。Socket在Java中被广泛用于构建客户端-服务器应用,例如创建Web服务器、聊天应用程序、文件传输等。以下是...

    JAVA Socket 网络编程教程

    Java Socket网络编程是Java开发中一个重要的组成部分,它允许应用程序通过网络进行通信,实现客户端与服务器之间的数据交换。本教程将深入探讨Java Socket编程的基本概念、原理和实践应用。 一、Socket基本概念 ...

    基于Java的源码-Java Socket通信实现.zip

    10. **实战应用**:Java Socket通信不仅限于命令行程序,还可以嵌入到Web应用、桌面应用中,例如,WebSocket协议就是基于TCP的Socket实现的,用于在Web浏览器和服务器之间进行全双工通信。 以上是对"基于Java的源码...

    java开发实战经典

    6. **多线程**:讲解线程的创建方式(Thread类和Runnable接口)、线程同步(synchronized关键字、wait/notify机制、Lock锁)以及并发工具类如Semaphore、CountDownLatch等。 7. **网络编程**:包括Socket编程,理解...

    java socket通信h

    Java Socket通信是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的双向通信。Socket在Java中提供了TCP(传输控制协议)的编程接口,使得开发者能够构建可靠的、基于连接的数据传输通道。下面将详细介绍...

    Java Socket示例

    综上所述,"Java Socket示例"是一个展示如何在Java中使用Socket进行网络通信的基础应用,它涉及到了网络编程、多线程和GUI设计等多个方面,是学习Java网络编程的绝佳起点。通过理解和实践这个示例,开发者可以更好地...

    java socket教程.

    1. **多线程**:服务器端通常需要同时处理多个客户端,可使用多线程技术,每个客户端连接分配一个线程。 2. **NIO(非阻塞I/O)**:Java NIO提供了更高效的数据读写方式,适用于高并发场景。 八、实战练习 1. 创建...

    java的socket编程课件~~~

    本课件详细介绍了Java Socket编程的基础知识和实战技巧,对于学习和理解网络编程具有极大的帮助。 首先,Socket编程基于TCP/IP协议栈,它提供了低级别的网络通信接口。在Java中,`java.net.Socket`类代表了客户端的...

    Java开发实战1200例(第1卷)

    本书覆盖了Java语言的基础到高级特性,包括面向对象编程、类库使用、异常处理、多线程、网络编程、数据库操作等各个方面。以下是对这些知识点的详细阐述: 1. **Java基础**:书中首先会介绍Java语言的基本语法,如...

    浅出Java Socket编程

    Java Socket编程是网络编程的基础,它是Java平台中用于实现客户端-服务器通信的关键组件。本教程将深入浅出地探讨Java Socket编程的核心概念和技术,帮助开发者理解如何构建可靠的网络应用程序。 一、Socket概述 ...

    Java Socket实现网络通话源码程序

    Java Socket 是一种基于TCP/IP协议族的通信方式,它允许两台计算机通过互联网进行双向通信。在Java中,Socket API提供了客户端(Client)和服务器端(Server)的通信接口,使得开发者可以创建出可靠的、基于连接的...

    《java开发实战经典》第二版李兴华课后习题答案

    5. Java语言特点:Java是一种面向对象的编程语言,拥有简单的语法结构,避免了复杂的指针操作,支持多线程编程,拥有自动垃圾回收机制,以及相对较高的安全性。其最大的特色是支持跨平台的可移植性。 6. Java中的...

Global site tag (gtag.js) - Google Analytics