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 成绩: ...
随机推荐
- 一键安装openstack juno 之controller node.
原文名称: OpenStack Juno Scripted Installation on CentOS 7 Step I: 本机信息配置 CONTROLLER_IP=192.168.173.133 ...
- iOS-程序启动原理和UIApplication(转载)
一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...
- flask 小知识总结 2018.12.18
Visual Studio Code 1.自定义python组建,方便某功能和代码的便捷操作 文件--首选项--用户代码片段--python.json--自定义需要的代码和功能 2.自定义快捷键方法 ...
- 洛谷P1083 借教室 NOIP2012D2T2 线段树
正解:线段树 解题报告: ...真的不难啊只是开了这个坑就填下? 就是先读入每天的教室数建个线段树然后每次读入就update一下,线段树存的就这一段的最小值啊,然后如果有次更新完之后tr[1]小于0了 ...
- 洛谷P4289 移动玩具 HAOI2008 搜索+状压
正解:状压 解题报告: 先,放下传送门QwQ 说真的我jio得这题不管是思路还是实现上,都还是有一定难度的?然后就看到神仙hl博客里一句"太水了不讲了"就过掉了,,,好的趴太强辽Q ...
- java.io.File实战
There are many things that can go wrong: A class works in Unix but doesn't on Windows (or vice versa ...
- 仿照hibernate封装的一个对数据库操作的jdbc工具类
package project02_Order_management.util; import java.io.IOException; import java.lang.reflect.Field; ...
- HashMap(不是线程安全)与ConcurrentHashMap(线程安全)
HashMap不是线程安全的 ConcurrentHashMap是线程安全的 从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- jpress-配合nginx与tomcat安装
目录 1. 前言 2. yum安装tomcat 2. yum安装MySQL 3. 下载JPress并安装 4. 配置tomcat使其可以部署多个网站 5. 安装nginx并配置 6. 将已经安装好的j ...