应用多线程来实现服务器与多客户端之间的通信。

基本步骤:

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通信的更多相关文章

  1. 事件驱动的TCP协议Socket通信

    事件驱动的TCP协议Socket通信 介绍 常规的Socket通信案例一般都是在某个线程中建立连接,然后用一个while(true)循环判断是或否有数据传输,但是这种方法有局限性. 1.收到消息在处理 ...

  2. IOS 基于TCP的socket通信详解(原创)

    最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...

  3. 基于TCP协议Socket通信

    服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...

  4. 基于TCP的socket通信过程及例子

    Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...

  5. 多线程方式实现Socket通信

    一.首先,介绍下两类传输协议:TCP:UDP TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流 ...

  6. 基于tcp的socket通信

    # socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...

  7. JAVA TCP/IP Socket通信机制以及应用

    关于局域网通信(同一wifi下,自己电脑当服务端,同一网络段) 1.例如192.168.1.x,只有x位不相同视为同一网络段 2.当具备了以上条件,即可编写服务端代码,服务端的机制. 3.Server ...

  8. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  9. TCP/IP Socket通信demo

    一个实例通过client端和server端通讯 客户端发送:“我是客户端,请多关照” 服务端回复:“收到来自于"+s.getInetAddress().getHostName()+" ...

随机推荐

  1. Django之跨域请求同源策略

    同源策略: 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过 ...

  2. 堆排序工具类(适用于top k问题,java泛型实现)

    代码如下,作用如标题所述 public class HeapSort { //方法作用:取出list里面的最小的 k 个值 public static <T extends Comparable ...

  3. Python实现——一元线性回归(梯度下降法)

    2019/3/25 一元线性回归--梯度下降/最小二乘法_又名:一两位小数点的悲剧_ 感觉这个才是真正的重头戏,毕竟前两者都是更倾向于直接使用公式,而不是让计算机一步步去接近真相,而这个梯度下降就不一 ...

  4. 三个常用的PHP图表类库

    Jpgraph 只要把example中的require_once路径改了就放进来用吧,我下的是最新版的jpgraph-3.5.0b1,反正测试嘛,我记得跟3.0.7还是有差别的,把文件名都重新命名过了 ...

  5. Tomcat 部署项目的几种常见方式

    转自:https://www.cnblogs.com/yuht/p/5714624.html https://www.cnblogs.com/ysocean/p/6893446.html Tomcat ...

  6. Qt 学习之路 2(72):线程和事件循环

    Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻>  --  有需求的话还需要进行专题学习  豆子  2013年11月24日  Qt 学习之路 2  34条评论 前面一章我 ...

  7. Qt 学习之路 2(65):访问网络(1)

    Home / Qt 学习之路 2 / Qt 学习之路 2(65):访问网络(1) Qt 学习之路 2(65):访问网络(1)  豆子  2013年10月11日  Qt 学习之路 2  18条评论 现在 ...

  8. Win7电脑开机无法正常启动只能进入安全模式解决方式

    我们先尝试在开机的时候按F8进入安全模式,进入到安全模式后一次打开“控制面板”-“程序与功能”,然后将卡巴斯基卸载[ http://jingyan.baidu.com/article/ff42efa9 ...

  9. [洛谷P4721]分治FFT

    NTT入门,放个板子 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #define fr( ...

  10. P4381 [IOI2008]Island

    传送门 显然题目给的图构成一个基环树森林 对于每个基环树单独考虑,显然每个都走直径是最优的 考虑如何求出基环树的直径 把直径分为两种情况考虑,首先可以找出环 因为直径可能不在环边上,所以对每个环上节点 ...