基于TCP协议Socket通信
服务器线程处理类
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通信的更多相关文章
- python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)
8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...
- 事件驱动的TCP协议Socket通信
事件驱动的TCP协议Socket通信 介绍 常规的Socket通信案例一般都是在某个线程中建立连接,然后用一个while(true)循环判断是或否有数据传输,但是这种方法有局限性. 1.收到消息在处理 ...
- python中基于tcp协议的通信(数据传输)
tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...
- IOS 基于TCP的socket通信详解(原创)
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...
- 基于tcp的socket通信
# socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...
- 为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发:udp协议没有链接存在,udp直接丢数据,不管你有没有收到. TCP的可靠保证,是它的三次握手双向机制,这一 ...
- 基于TCP的socket通信过程及例子
Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...
- 基于Tcp协议的简单Socket通信实例(JAVA)
好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...
- Java Web 基础(一) 基于TCP的Socket网络编程
一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...
随机推荐
- Android Studio 学习笔记(二):布局简介和xmlns说明
初学Android Studio,是在b站看的教程视频,这里的笔记也是以其为基础的,个人强烈安利: [天哥]Android开发视频教程最新版 Android Studio开发 Android 布局简介 ...
- 题解 SP375 【QTREE - Query on a tree】
\[ \texttt{Preface} \] 这题在 \(\text{Luogu}\) 上竟然不能交 \(C++\) ,会一直 \(Waiting\) ,只能交非 \(C++\) 的语言. 所以打完了 ...
- mixin很难吗?
实践类工作经常会遇到这样的问题,有些概念会用不会说,最近在学习Dart,遇到mixin便是如此.读了几篇网文总觉得良莠不齐,一群码友也说越读越懵,索性静下心来重新出发,一点一滴地弄明白.记录下来分享给 ...
- C++ 日期 & 时间(转)
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数. 为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件.有四个与时间相关的类型:cloc ...
- 面向对象之包装类与Object类
一.包装类(Wrapper) 1.包装类出现原因 为了使8种基本数据类型的变量具有类的特征,引入包装类 2.类型间转化 ① 基本数据类型---->对应的包装类:自动装箱 包装类---->对 ...
- 2Nginx+keepalive+2tomcat 故障转移
根据真实生产环境 总结. 硬件:共计2台Linux服务器 76和77 每台服务器都安装 Nginx Keepalive Tomcat80作为虚拟ip,负责对外连接. 78和79是两台mys ...
- CentOS7时区和时间设置
[root@saltstack-master ~]# timedatectl set-timezone Asia/Shanghai [root@saltstack-master ~]# ln -sf ...
- 安利自己写的easy-clipboard库
概述 clipboard.js 是一个非常好用的剪切板插件,但是随着前端框架的演变,用户与网页交互的方式越来越多,不仅限于点击事件了,并且在很多情况下,我们可能不需要它强制性自带的点击事件,所以我打算 ...
- 高并发之——不得不说的线程池与ThreadPoolExecutor类浅析
一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但为什么在JDK1.5中又提供了线程池技术呢?这个问题大家自行脑补,多动脑,肯定没坏处,哈哈哈... 说起Java中的线程池技术,在很多 ...
- ThreadPoolExecutor之RejectedExecutionHandler
最近工作种常用到ThreadPoolExecutor这个对象, 这是一个并发编程中非常常用的对象.因为和并发编程相关所以它存在于java.util.concurrent这包中. 创建这个对象的基本方法 ...