多线程TCP的socket通信
应用多线程来实现服务器与多客户端之间的通信。
基本步骤:
1.服务器端创建ServerSocket,循环调用accept()等待客户端的连接
2.客户端创建一个socket并请求和服务器端的连接
3.服务器端接收客户端的请求,创建socket与该客户端建立专线连接
4.建立连接的两个socket在一个单独的线程上对话
5.服务器端继续等待新的客户端的连接
Server.java
public class Server {
public static void main(String[] args) throws IOException{
//1、创建一个服务器端的socket,指定绑定的端口,并侦听此端口
ServerSocket server = new ServerSocket(8888);
System.out.println("********服务端即将启动,等待客户端的连接********");
int count = 0;
//2、开始侦听,等待客户端的连接
while(true){
Socket socket = server.accept();
ServerThread thread = new ServerThread(socket);
thread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("客户端的ip:"+address.getHostAddress());
}
}
}
ServerThread.java
public class ServerThread extends Thread {
//和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
//线程执行操作,响应客户端的请求
public void run(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
//3、获取输入流,用来读取客户端发送的信息
is = socket.getInputStream();//字节输入流
isr = new InputStreamReader(is);//字符输入流
br = new BufferedReader(isr);//缓冲输入流
String info = null;
while((info=br.readLine()) != null){
//循环读取数据
System.out.println("客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
os = socket.getOutputStream();//字节输出流
pw = new PrintWriter(os);//打印输出流
pw.write("服务器端已接受你的请求,允许登录");
pw.flush();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
//4、关闭资源
if(pw != null)
pw.close();
if(os != null)
os.close();
if(br != null)
br.close();
if(isr != null)
isr.close();
if(is != null)
is.close();
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client.java
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException{
//1、创建客户端socket,指定服务器地址和端口
Socket socket = new Socket("127.0.0.1",8888);
System.out.println("******客户端已准备就绪*******");
//2、给服务端发送数据
OutputStream os = socket.getOutputStream();//字节流
PrintWriter pw = new PrintWriter(os);//打印流
pw.write("用户名:admin;密码:123456");
pw.flush();
socket.shutdownOutput();//关闭输出流
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//字符输入流
BufferedReader br = new BufferedReader(isr);//缓冲输入流
String info = null;
while((info=br.readLine()) != null){
System.out.println("服务端说:"+info);
}
socket.shutdownInput();//关闭输入流
//3、关闭资源
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
}
}
多线程TCP的socket通信的更多相关文章
- 事件驱动的TCP协议Socket通信
事件驱动的TCP协议Socket通信 介绍 常规的Socket通信案例一般都是在某个线程中建立连接,然后用一个while(true)循环判断是或否有数据传输,但是这种方法有局限性. 1.收到消息在处理 ...
- IOS 基于TCP的socket通信详解(原创)
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...
- 基于TCP协议Socket通信
服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...
- 基于TCP的socket通信过程及例子
Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...
- 多线程方式实现Socket通信
一.首先,介绍下两类传输协议:TCP:UDP TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流 ...
- 基于tcp的socket通信
# socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...
- JAVA TCP/IP Socket通信机制以及应用
关于局域网通信(同一wifi下,自己电脑当服务端,同一网络段) 1.例如192.168.1.x,只有x位不相同视为同一网络段 2.当具备了以上条件,即可编写服务端代码,服务端的机制. 3.Server ...
- python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)
8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...
- TCP/IP Socket通信demo
一个实例通过client端和server端通讯 客户端发送:“我是客户端,请多关照” 服务端回复:“收到来自于"+s.getInetAddress().getHostName()+" ...
随机推荐
- Java面向对象之异常(异常处理方式)
一.基础概念 (1)异常:Java程序在运行时期发生的不正常情况. Java就按照面向对象的思想对不正常情况进行描述和对象的封装. (2)异常问题分类: (Throwable:定义对于问题共性的功能. ...
- python3入门之列表和元组
获得更多资料欢迎进入我的网站或者 csdn或者博客园 前面一张主要学习了Python的安装,以及第一个程序helloword的编写,以及简单的输入和输出函数,这章主要介绍序列,列表,元组 序列 这章 ...
- SDUT OJ 3403 数据结构实验之排序六:希尔排序
数据结构实验之排序六:希尔排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- UML类图和时序图符号
看懂UML类图和时序图 https://www.cnblogs.com/me115/p/4092632.html 内容目录: 从一个示例开始 类之间的关系 时序图 附录:<图说设计模式> ...
- Qt 学习之路 2(46):视图和委托
Home / Qt 学习之路 2 / Qt 学习之路 2(46):视图和委托 Qt 学习之路 2(46):视图和委托 豆子 2013年3月11日 Qt 学习之路 2 63条评论 前面我们介绍了 ...
- bzoj4034 树上操作 树链剖分+线段树
题目传送门 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有 ...
- poj2420 A Star not a Tree? 找费马点 模拟退火
题目传送门 题目大意: 给出100个二维平面上的点,让你找到一个新的点,使这个点到其他所有点的距离总和最小. 思路: 模拟退火模板题,我也不懂为什么,而且一个很有意思的点,就是初始点如果是按照我的代码 ...
- hybrid app开发工具
hybrid app开发工具 1.AppCan AppCan是国内Hybrid App混合模式开发的倡导者,AppCan应用引擎支持Hybrid App的开发和运行.并且着重解决了基于HTML5的移动 ...
- 将Eclipse的Java Project转换为Dynamic Web Project
在用Eclipse做JavaEE开发时经常遇到Web工程被识别为Java工程的问题,导致很多功能无法使用. 只需做以下操作便可解决该问题. 1.右击Java工程选择Properties 2.选择左边目 ...
- 【记录】adb连不上手机
1.\用户\.android文件夹下新建adb_usb.ini,内容为手机的VID值,如0x9BB5 2.重启adb adb kill-server adb start-server adb devi ...