这篇文章主要介绍了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通讯实现过程及问题解决相关推荐

  1. java socket通讯_Java socket通讯实现过程及问题解决

    这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...

  2. java socket 全双工_java socket实现全双工通信

    单工.半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工. 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输. 如果 ...

  3. java socket 超时_Java Socket超时浅析

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...

  4. java socket 端口_Java Socket通信如何摆平自身端口问题

    Java Socket通信在使用的时候有不少的问题,在端口编程上来说是一个十分重要的.下面我们就看看Java Socket通信如何才能更好的使用相关的代码.希望大家有所帮助. 事实上网络编程简单的理解 ...

  5. java socket 工具_java+socket 简易聊天工具

    1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...

  6. java socket字符串_Java Socket Bug:从Socket的InputStream读取字符串

    我正在使用Socket与ServerSocket进行通信.字符串正从服务器发送到我的套接字.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪. 问题在于数据正在"爆 ...

  7. java socket通信安全_Java Socket通信

    原理: 1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低 2.请求-响应模式 a.客户端 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Clien ...

  8. java socket数据传输_Java Socket编程(一) Socket传输模式

    Java Socket编程(一) Socket传输模式 文章来源:ASPCN 作者:孙雯 Socket传输模式 Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就 ...

  9. java socket 工具_java Socket简易聊天工具

    本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...

最新文章

  1. [工具]各种截图工具和录屏软件
  2. 深度学习:语义分割网络
  3. js获取选中文件的后缀名
  4. 大数据技术基础_【基础】大数据技术栈介绍
  5. mysql 5.7 引擎_MySQL 5.7 学习:功能性能的提升
  6. javascript 观察者(发布订阅)模式详解
  7. [Android]关于IntentService
  8. 基于Java+SpringBoot+vue+element实现火车订票平台管理系统
  9. c语言中变量的大小,C语言变量定义
  10. IP计算机取证,计算机取证1资料.doc
  11. html中的灵动标签,《帝国网站管理系统》一招鲜吃天遍天系列教程之 灵动标签使用...
  12. Java异常与异常处理简单使用
  13. 全球Top10最佳移动统计分析sdk
  14. 洗衣机一边进水一边出水 更换排水阀皮碗
  15. 《我也能做CTO之程序员职业规划》之二:做CTO的苹果定律
  16. ibm服务器硬件故障检测工具,IBM服务器故障提示Memory/bttery problems were detected
  17. 《深入浅出通信原理》连载1-562合集
  18. 配置java win10_win10 Java14安装及配置
  19. 工具类之十七 基于zxing的二维码生成工具类
  20. 测试银行卡号必看(长度限制及卡号字符类型总结)

热门文章

  1. LiDAR Snowfall Simulation for Robust 3D Object Detection
  2. mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)
  3. 著名歌唱家大衣哥太豪横了,参加商演被主办方请到五星级酒店就餐
  4. 转:HiRes高采样率的必要性
  5. Hedge fund Two Sigma hires Alfred Spector as Chief Technology Officer
  6. IT农民工如何来美国工作(续)
  7. pd.concat()和pd.merge()
  8. html仿网易云网站,GitHub - Hdoove/music-webapp: 仿网易云webapp
  9. 服务器系统和操作系统的区别
  10. PowerDesigner 15及破解补丁_PowerDesigner 12.5及破解补丁_PowerDesigner破解版_PowerDesigner下载