java socket通讯_Java socket通讯实现过程及问题解决
这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本来是打算验证java socket是不是单线程操作,也就是一次只能处理一个请求,处理完之后才能继续处理下一个请求。但是在其中又发现了许多问题,在编程的时候需要十分注意,今天就拿出来跟大家分享一下。
首先先建立一个服务端代码,运行时也要先启动此程序。
package com.test.some.Socket;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Description: socket服务端代码
* @Author: haoqiangwang3
* @CreateDate: 2020/1/9
*/
public class MySocketServer1 {
// 服务器监听端口
private static int port = 8081;
public static void main(String[] args) throws InterruptedException {
try {
//1.得到一个socket服务端
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
// 2.等待socket客户端的请求。accept方法在有连接请求时才会返回
System.out.println("等待客户端请求。。。");
Socket socket = serverSocket.accept();
System.out.println("客户端请求来了。。。");
// 3.获取socket输入流
InputStream inputStream = socket.getInputStream();
/* BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println("接收到的请求数据为:" + bufferedReader.readLine());*/
// 读取请求内容的缓冲区
byte[] bytes = new byte[1024];
int length = 0;
StringBuilder sb = new StringBuilder();
//获取客户端请求的内容
while ((length = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, length, "utf-8"));
}
System.out.println("接收到的请求数据为:" + sb.toString());
//Thread.sleep(50000); // 4.获取socket输出流
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
String backStr = "服务端接收到了请求";
printWriter.write(new String(backStr.getBytes(), "utf-8"));
printWriter.flush();
//5.关闭资源
//bufferedReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
socket.close();
}
} catch (IOException e) {
System.err.println("socket监听失败!" + e);
}
}
}
此代码模拟了正常系统成socket服务端的方式,就是一个无限循环监听我们绑定的端口,当有客户端请求来了之后进行处理。
下面就是客户端请求代码
package com.test.some.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @Description: socket客户端代码
* @Author: haoqiangwang3
* @CreateDate: 2020/1/9
*/
public class MySocketClient1 {
//socket请求ip地址
private static String host = "127.0.0.1";
//socket请求端口
private static int port = 8081;
public static void main(String[] args) {
try {
//1.建立一个客户端
Socket socket = new Socket(host, port);
//2.得到socket输出流
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
String sendStr = "发送数据1";
//发送数据
printWriter.write(sendStr);
printWriter.flush();
socket.shutdownOutput();
//3.得到socket输入流
InputStream inputStream = socket.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] bytes = new byte[1024];
while (inputStream.read(bytes) != -1) {
sb.append(new String(bytes, "utf-8"));
}
System.out.println("接收到的返回数据为:" + sb);
//4.关闭资源
printWriter.close();
outputStream.close();
inputStream.close();
socket.close();
} catch (Exception e) {
System.err.println("socket请求失败" + e);
}
}
}
客户端代码主要就是向服务端发送数据,然后等待服务端的响应,打印出服务端的响应内容。
最终打印结果如下。服务端:
客户端:
首先明确几个概念,下面将会用到。
flush()方法:用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存缓冲区中,然后再用数据写到文件中。
socket.shutdownOutput()方法:他是一种单向关闭流的方法,即关闭客户端的输出流并不会关闭服务端的输出流。通过shutdownOutput()方法只是关闭了输出流,但socket仍然是连接状态,连接并未关闭。
printWriter.close()方法:如果直接关闭输入或者输出流,即:in.close()或者out.close(),会直接关闭socket。
流中的关闭顺序:一般情况下是:先打开的后关闭,后打开的先关闭。另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b,例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b。当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。如果将节点流关闭以后再关闭处理流,会抛出IO异常。
下面总结下我遇到的问题。
1.客户端发送数据部分的代码,printWriter.flush(); socket.shutdownOutput(); 这两句代码十分的重要,flush()方法如果不添加的话,服务端接收到的数据将为空,shutdownOutput()方法不添加的话,服务端将一直等待读取客户端的数据,不会往下进行,大家可以自测一下。我自己的理解是flush()的作用是为了把数据从内存中刷新到socket流中,shutdownOutput()方法是告诉服务端,我没有东西要传输了,所以服务端也就会停止等待读取客户端发送的内容,程序就可以继续向下走。
2.打开服务端中的sleep方法,在新建一个客户端,同时开启请求服务端,会发现服务端确实是一个连接一个连接的处理,所以这也是socket性能所在的问题。
3.如果不用字符流读取,客户端发送数据直接用outputStream.write(sendStr.getBytes());,可以发现此时不用调用flush()方法,但是socket.shutdownOutput()依然需要。这是因为直接读取到socket的输出流,并没有读到内存中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java socket通讯_Java socket通讯实现过程及问题解决相关推荐
- java socket 卡住_Java socket通讯实现过程及问题解决
这篇文章主要介绍了java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...
- java socket 端口_Java Socket通信如何摆平自身端口问题
Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...
- java socket通信安全_Java Socket通信
原理: 1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低 2.请求-响应模式 a.客户端 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Clien ...
- java socket 全双工_java socket实现全双工通信
单工.半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工. 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输. 如果 ...
- java socket 超时_Java Socket超时浅析
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...
- java socket 工具_java+socket 简易聊天工具
1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...
- java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串
我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...
- java socket数据传输_Java Socket编程(一) Socket传输模式
Java Socket编程(一) Socket传输模式 文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就 ...
- java socket 工具_java Socket简易聊天工具
本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...
最新文章
- pyqt tableview mysql_当数据库中添加了一个新条目时,如何在PyQt中更新TableView?
- python字典怎么排序_如何对python的字典进行排序
- ORA-02291: 违反完整约束条件 - 未找到父项关键字 解决方法
- 【Android】Touch事件分发
- android编译系统学习 .
- Linux对运行服务操作命令
- (9)有一些人在学习编程的时候总以为代码是死板的
- RIP实验总结之一被动接口和单播更新
- C++学习笔记56:异常处理
- es6 Iterator(迭代器)的概念
- 实习笔试题,源代码编译
- MFC鼠标单击截获鼠标双击事件,且无法记录单击的数据的解决方案
- Maven-01-私服搭建及使用
- paip.输入法编程---带ord gudin去重复-
- html实现2048小游戏,html+css+js适合前端小白的实战全解(超详细)——2048小游戏(二)...
- Java自定义生成PDF报告
- 逻辑函数的化简方法——数电第二章学习
- python打印网页成pdf_html – 在chrome-python 2.7中自动打印/保存网页为pdf
- flowable-6.7(一)从工作流与BPMN到flowable
- 实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。
热门文章
- python socket服务器_记-python socket服务器端四部曲
- h5 登录页面_一份写给新手的微信H5页面制作流程介绍
- 西安工业大学计算机全国排名,西安工业大学北方信息工程学院排名2018年下滑14名 在独立学院中实力排全国第138名...
- XXE漏洞攻击与防御
- 设置JDK环境变量(linux版)
- Android 多屏幕适配 dp和px的关系
- c++头文件包含问题
- C++ 工程实践(2):不要重载全局 ::operator new()
- SilverLight是什么?(来自Csdn)
- 超越 YOLOv5 的目标检测开源项目又上新了