JAVA I/O(五)多线程网络Socket和ServerSocket
上篇文章介绍了Socket和ServerSocket简单使用和源码,服务器端会对每个客户端请求创建一个线程,为使服务器端能同时处理多个客户端请求,可以采用多线程的方式。本文仅对实例进行简单记录,如下。
服务器端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class MultiJabberServer { static final int PORT = 8080; public static void main(String[] args) throws IOException{
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server Started");
try {
while(true) {
Socket socket = serverSocket.accept();
try {
new ServeOneJabber(socket);
} catch (IOException e) {
// If it fails, close the socket,
// otherwise the thread will close it:
socket.close();
}
}
} finally {
serverSocket.close();
}
}
}
while循环获取连接,并构造ServerOneJabber,启动线程处理客户端交互。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket; public class ServeOneJabber extends Thread{ private Socket socket; private BufferedReader in; private PrintWriter out; public ServeOneJabber(Socket socket) throws IOException{
this.socket = socket;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
start();
} public void run() {
try {
while (true) {
String str = in.readLine();
if ("END".equals(str)) {
break;
}
System.out.println("Echoing: " + str);
out.println("Got: " + str);
}
System.out.println(socket + ", seesion closing....");
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
socket.close();
} catch (Exception e2) {
System.out.println("Socket not closed");
}
}
}
}
原理与上篇文章一样,获取输入输出流,对请求信息进行处理和响应。
客户端
import java.io.IOException;
import java.net.InetAddress; public class MultiJabberClient { static final int MAX_THREADS = 40; public static void main(String[] args) throws IOException, InterruptedException{
InetAddress addr = InetAddress.getByName(null);
for(int i = 0; i < MAX_THREADS; i++) {
new JabberClientThread(addr);
Thread.sleep(100);
}
// while(true) {
// if(JabberClientThread.threadCount() < MAX_THREADS) {
// new JabberClientThread(addr);
// }
// Thread.sleep(100);
// }
}
}
构造线程JabberClientThread,构建Socket,与服务器端连接。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket; public class JabberClientThread extends Thread{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private static int counter = 0;
private int id = counter++;
private static int threadCount = 0; public static int threadCount() {
return threadCount;
} public JabberClientThread(InetAddress addr){
System.out.println("Making client " + id);
threadCount++;
try {
socket = new Socket(addr, MultiJabberServer.PORT);
} catch (IOException e) {
// If the creation of the socket fails,
// nothing needs to be cleaned up.
System.out.println("Socket failed");
return;
}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
start();
} catch (IOException e) {
// The socket should be closed on any
// failures other than the socket
// constructor:
try {
socket.close();
} catch (IOException e2) {
System.err.println("Socket not closed");
} }
} public void run() {
try {
for(int i = 0; i < 5; i++) {
out.println("Client " + id + ":" + i);
String str = in.readLine();
System.out.println(str);
}
out.println("END");
} catch (IOException e) {
System.err.println("IO Exception");
} finally {
try {
socket.close();
} catch (IOException e2) {
System.err.println("Socket not closed");
}
threadCount--;
}
}
}
其中包含成员属性id和threadCount,每创建一个线程,id递增(采用类成员控制);threadCount作为线程数量的记录,线程创建时加一,结束时减一。
运行结果如下:
服务器端:
Server Started
Echoing: Client 0:0
Echoing: Client 0:1
Echoing: Client 0:2
Echoing: Client 0:3
Echoing: Client 0:4
Socket[addr=/127.0.0.1,port=42998,localport=8080], seesion closing....
Echoing: Client 1:0
Echoing: Client 1:1
Echoing: Client 1:2
Echoing: Client 1:3
Echoing: Client 1:4
Socket[addr=/127.0.0.1,port=43000,localport=8080], seesion closing....
......
Echoing: Client 39:0
Echoing: Client 39:1
Echoing: Client 39:2
Echoing: Client 39:3
Echoing: Client 39:4
Socket[addr=/127.0.0.1,port=43076,localport=8080], seesion closing....
客户端:
Making client 0
Got: Client 0:0
Got: Client 0:1
Got: Client 0:2
Got: Client 0:3
Got: Client 0:4
Making client 1
Got: Client 1:0
Got: Client 1:1
Got: Client 1:2
Got: Client 1:3
Got: Client 1:4
.....
Making client 39
Got: Client 39:0
Got: Client 39:1
Got: Client 39:2
Got: Client 39:3
Got: Client 39:4
JAVA I/O(五)多线程网络Socket和ServerSocket的更多相关文章
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- JAVA I/O(四)网络Socket和ServerSocket
<Thinking in Enterprise Java>中第一章描述了用Socket和Channel的网络编程,核心即为Socket和Channel,本文简单讲述Socket的应用. S ...
- java多线程实现TCP网络Socket编程(C/S通信)
目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...
- 网络开发Socket和ServerSocket
已经发表个人公众号 Socket和ServerSocket Socket为"孔"或"插座",创建Socket,打开连接Socket的输入或输出流,对Socket ...
- java socket 多线程网络传输多个文件
http://blog.csdn.net/njchenyi/article/details/9072845 java socket 多线程网络传输多个文件 2013-06-10 21:26 3596人 ...
- Java实验报告五:Java网络编程及安全
Java实验报告五:Java网络编程及安全 ...
- Java基础知识➣网络Socket(六)
概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之 ...
- 20155205《Java程序设计》实验五(网络编程与安全)实验报告
20155205 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 两人一组结对编程 参考http://www.cnblogs.com/rocedu/p/6 ...
- 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
20165230 <Java程序设计>实验五<网络编程与安全>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
随机推荐
- python数据结构之堆栈
本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记 堆栈(Stack) 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行. 堆栈可以通过数组和链表轻松实现 一 ...
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
感谢一路走来默默支持和陪伴的你~~~ -------------------欢迎来访,拒绝转载-------------------- 一.Rest API基础 ArcGIS 平台提供了丰富的REST ...
- GraphLab GraphLab和MapReduce的区别
https://turi.com/ GraphLab和MapReduce的区别 https://baike.baidu.com/item/GraphLab/16423125 2. GraphLab和M ...
- dp——01背包
今天学习了01背包不算是复习吧,发现完全不会状态之间的转移如此让我捉摸不透尽管很简单但本人觉得还是很难,奇怪地拐点也很难被发现.知道01背包二维的话是很慢的,然后就是非得先打二维毕竟一维是根据二维的想 ...
- 新同事,git又报错Please move or remove them before you merge
http://blog.csdn.net/hufengvip/article/details/17231133 下面一行搞定 git clean -d -fx ""
- 优云软件应邀出席 ITSS 数据中心运营管理工作组 2017 年春季研讨会
2017 年 4 月 15 日,中国电子工业标准化技术协会信息技术服务分会(以下称 ITSS 分会)数据中心运营管理工作组(以下简称 DCMG)在江苏省启东市召开春季研讨会. DCMG 工作组组长肖建 ...
- 洛谷P4035 球形空间产生器 [JSOI2008] 高斯消元
正解:高斯消元 解题报告: 链接! 昂开始看到以为是,高斯消元板子题? 开始很容易想到的是,虽然是多维但是可以类比二维三维列出式子嘛 但是高斯消元是只能处理一元问题的啊,,,辣怎么处理呢 对的这就是这 ...
- inux man命令的使用方法(转)
原文:http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html Linux的man手册共有以下几个章节: 代號 代表內容 1 使用 ...
- java Arrays.asList 问题
1.问题 public static void asList() { System.out.println(Arrays.asList(new String[] { "a", &q ...
- 关于获取多个id的用法
一.子页面中的写法 <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" ...