服务器线程处理类

package demo4;

import java.io.*;
import java.net.Socket; /**
* 服务器线程处理类
* @ClassName ServerThread
* @Author DiYun
* @Version 1.0
**/
public class ServerThread extends Thread { //和 本线程相关的Socket
Socket socket = null; public ServerThread(Socket socket) {
this.socket = socket;
} //线程执行的操作,响应客户端的请求
public void run() {
InputStream inputStream =null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
OutputStream outputStream = null;
PrintWriter printWriter = null; try {
//3.获取输入流 并读取客户端信息
inputStream = socket.getInputStream();//获取字节流
inputStreamReader = new InputStreamReader(inputStream); //读取字节流
bufferedReader = new BufferedReader(inputStreamReader);//为输入流添入缓冲
String info = null;
while ((info = bufferedReader.readLine()) != null) {
//循环读取客户端信息
System.out.println("我是服务器,客户端说:" + info);
} //关闭输入流
socket.shutdownInput(); //4.获取输出流,响应客户端的请求
outputStream = socket.getOutputStream(); //获取输出流,响应客户端的请求
printWriter = new PrintWriter(outputStream);
printWriter.write("欢迎您!");
printWriter.flush(); //调用flush方法将缓冲输出 } catch (IOException e) {
e.printStackTrace();
} finally {
try {
//5.关闭资源
if (printWriter !=null)
printWriter.close();
if(outputStream !=null)
outputStream.close();
if (bufferedReader !=null)
bufferedReader.close();
if(inputStreamReader !=null)
inputStreamReader.close();
if(inputStream !=null)
inputStream.close();
if(socket !=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

服务器端代码

package demo4;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays; /**
* 基于TCP 协议Socket 服务端
* @ClassName Server
* @Author DiYun
* @Version 1.0
**/
public class Server {
public static void main(String[] args) {
try {
//1.创建一个服务端Socket即ServerSocket 指定服务的端口并监听
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
//记录客户端连接的数量
int count = 0;
System.out.println("服务端已经启动,等待客户端连接************************");
while (true) {
//2.调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++; //统计客户端的数量
System.out.println("客户端的数量" + count);
InetAddress inetAddress = socket.getInetAddress();
System.out.println("当前IP地址是:" + inetAddress.getHostAddress());
System.out.println("客户端信息:" + Arrays.toString(inetAddress.getAddress()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端

package demo4;

import java.io.*;
import java.net.Socket; /**
* 基于CTP 协议的 Socket 客户端
*
* @ClassName Client
* @Author DiYun
* @Version 1.0
**/
public class Client {
public static void main(String[] args) {
try {
//1.创建客户端 Socket 指定服务器地址和端口
Socket socket = new Socket("localhost", 8888);
//2.获取输出流,向服务端发送信息
OutputStream outputStream = socket.getOutputStream();
//将输出流包装为打印流
PrintWriter pw = new PrintWriter(outputStream);
pw.write("用户名:admin 密码: 12346");
pw.flush();
socket.shutdownOutput();//关闭输出流 //3.获取输出流 并读取服务端的响应信息
InputStream inputStream = socket.getInputStream();
//
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while ((info = bufferedReader.readLine()) != null) {
//循环读取客户端信息
System.out.println("我是客户端,服务端说:" + info);
} //4.关闭资源
bufferedReader.close();
inputStream.close(); pw.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

注意,必须首先启动服务器再启动客户端

基于TCP协议Socket通信的更多相关文章

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

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

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

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

  3. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

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

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

  5. 基于tcp的socket通信

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

  6. 为何基于tcp协议的通信比基于udp协议的通信更可靠?

    tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发:udp协议没有链接存在,udp直接丢数据,不管你有没有收到. TCP的可靠保证,是它的三次握手双向机制,这一 ...

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

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

  8. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  9. Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

随机推荐

  1. Python3(三) 变量与运算符

    一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1,   a='1',   a=(1,2),  ...

  2. ubuntu下怎么配置/查看串口-minicom工具

    一.安装minicom工具: 可直接使用命令sudo apt-get install minicom来完成安装 上面的截图因为检测到我已经安装过了. 二.通过minicom工具配置串口: 1.启动mi ...

  3. 授权认证(IdentityServer4)

    区别 OpenId: Authentication :认证 Oauth: Aurhorize :授权 输入账号密码,QQ确认输入了正确的账号密码可以登录 --->认证 下面需要勾选的复选框(获取 ...

  4. vue-cli3点滴

    1.如果你不在构造函数中声明private的变量,那么久会提示错误. 2.

  5. hexo--定制开发

    新建页面 hexo new page "新建博文章的名称" 这时会在工程的source目录下新建about目录,里面新建index.md 在主题的_configy.yml中配置新页 ...

  6. codewars--js--Large Factorials--阶乘+大数阶乘

    问题描述: In mathematics, the factorial of integer n is written as n!. It is equal to the product of n a ...

  7. 用 Python 分析今年考研形势

    还有5天,就到了考研初试的时间了. ! 尽管今年研招网内部,已经做了优化改善,还是抵挡不住考生们的报名热情(网站崩溃). ​ 2017年考研人数增长至201万人, 2018年则达到238万人, 201 ...

  8. git系列之---将本地的项目添加到码云仓库

    1.前情: 本地写的 Demo 传到码云上面进行维护. 2.操作步骤: git init   将本地文件初始化为git 仓库,文件件会多一个 .git 文件夹[版本库]: git add .   或者 ...

  9. PVE裸机虚拟化环境安装之后的一些部署记录

    pve镜像使用的是proxmox-ve_6.1-1 安装之后root登录 apt update 更新源的时候会出现一些问题,是因为其中有一个企业源报错的原因 安装sudo和vim,否则不好管理非roo ...

  10. springboot~HttpPut开启application/x-www-form-urlencoded

    在使用spring框架时,默认情况下@RequestParam注解只到接受Get和Post请求参数 ,而对于Put来说默认是使用@ReqeustBody注解的,如果希望为Put也开启@RequestP ...