Java Socket通讯客户端代码详解

开发 后端
Java Socket通讯一直是很多程序员的一块心病,下面我们就来看看如何才能更好的使用相关的代码。希望大家有所帮助。

Java Socket通讯一个相当广泛的使用,其实在有些时候我们在遇到困难的时候还是需要去找一找相关代码的介绍。最近工作需要,做了一点Java Socket通讯的东西,积累一点经验,与大家共分享。

其中通过短连接方式接收Java Socket通讯返回消息,死循环,分别判断接收和超时,来确定连接连接状况。通过字节流的形式获取socket返回消息,主要是因为通过readline的方式,在我们系统通讯中存在异常。

具体客户端代码如下:

 

  1. import java.net.*;  
  2. import java.io.*;  
  3. import org.apache.log4j.Logger;  
  4. public class SocketClient {  
  5. static Logger log = Logger.getLogger(SocketClient.class.
    getName()); //日志记录信息  
  6. private String hostName;  
  7. private int portNum;  
  8. private int delaySecond; // 发文接收返回报文延时  
  9. public SocketClient() {  
  10. this.hostName = "192.168.0.1";  
  11. this.portNum = 7000;  
  12. this.delaySecond = 50000;  
  13. pFileOp = null;  
  14. }  
  15. private Socket getSocket() {  
  16. Socket socket = null;  
  17. try {  
  18. socket = new Socket(hostName, portNum);  
  19. } catch (UnknownHostException e) {  
  20. System.out.println("-->未知的主机名:" + hostName + " 异常");  
  21. } catch (IOException e) {  
  22. System.out.println("-hostName=" + hostName + " portNum="  
  23. + portNum + "---->IO异常错误" + e.getMessage());  
  24. }  
  25. return socket;  
  26. }  
  27. public String sendMessage(String strMessage) {  
  28. String str = "";  
  29. String serverString = "";  
  30. Socket socket;  
  31. try {  
  32. socket = getSocket();  
  33. // socket.setKeepAlive(true);  
  34. if (socket == null) { // 未能得到指定的Socket对象,Socket通讯为空  
  35. return "0001";  
  36. }  
  37. PrintWriter out = new PrintWriter(socket.getOutputStream());  
  38. //log.info("---->发送报文="+strMessage);  
  39. out.println(strMessage);  
  40. out.flush();  
  41. BufferedReader in = new BufferedReader(new InputStreamReader(  
  42. socket.getInputStream()));  
  43. long sendTime = System.currentTimeMillis();  
  44. long receiveTime = System.currentTimeMillis();  
  45. boolean received = false; // 成功接收报文  
  46. boolean delayTooLong = false;  
  47. serverString = null;  
  48. while (!received && !delayTooLong) {  
  49. if (socket.getInputStream().available() > 0) {  
  50. // serverString = in.readLine();  
  51. char tagChar[];  
  52. tagChar = new char[1024];  
  53. int len;  
  54. String temp;  
  55. String rev = "";  
  56. if ((len = in.read(tagChar)) != -1) {  
  57. temp = new String(tagChar, 0, len);  
  58. rev += temp;  
  59. temp = null;  
  60. }  
  61. serverString = rev;  
  62. }  
  63. receiveTime = System.currentTimeMillis();  
  64. if (serverString != null)  
  65. received = true; // 字符串不为空,接收成功  
  66. if ((receiveTime - sendTime) > delaySecond)  
  67. delayTooLong = true; // 接收等待时间过长,超时  
  68. }  
  69. in.close();  
  70. out.close();  
  71. str=serverString;  
  72. if (delayTooLong) str="2190"; //超时标志为真,返回超时码  
  73. if (!received) str ="2190";  
  74. socket.close();  
  75. } catch (UnknownHostException e) {  
  76. log.error("---->出现未知主机错误! 主机信息=" + this.hostName + 
    " 端口号="  
  77. + this.portNum + " 出错信息=" + e.getMessage());  
  78. str = "2191";  
  79. // System.exit(1);  
  80. } catch (IOException e) {  
  81. log.error("---->出现IO异常! 主机信息=" + this.hostName + 
    " 端口号="  
  82. + this.portNum + " 出错信息=" + e.getMessage());  
  83. e.printStackTrace();  
  84. str = "2191";  
  85. } catch (Exception e) {  
  86. str="2177";  
  87. log.error("---->出现未知异常" + e.getMessage());  
  88. } finally {  
  89. socket = null;  
  90. str.trim();  
  91. //log.info("--->返回的socket通讯字符串="+str);  
  92. return str;  
  93. }  
  94. }  

以上就是对Java Socket通讯的详细介绍。希望大家有所帮助。

【编辑推荐】

  1. Java线程模型如何完善相关的数据处理
  2. Java线程死锁如何避免这一悲剧
  3. Java线程同步锁解决共享数据安全
  4. Java线程同步如何在不同线程中调用
  5. Java线程同步的优先级介绍
责任编辑:张浩 来源: 互联网
相关推荐

2010-03-18 17:30:46

Java Socket

2010-03-18 17:39:46

Java Socket

2010-03-17 18:04:55

java Socket

2014-08-11 16:35:35

KafkaJava客户端

2010-03-19 09:26:34

Java Socket

2010-05-12 15:46:51

Subversion客

2009-03-04 10:27:50

客户端组件桌面虚拟化Xendesktop

2020-04-23 09:32:33

zookeeperCP系统

2010-04-08 15:35:13

Oracle 简易客户

2010-03-18 17:47:07

Java 多客户端通信

2009-07-24 17:31:56

ASP.NET AJA

2010-05-31 15:55:42

2013-06-08 09:59:15

VMwarevSphere Web

2010-06-01 14:11:11

TortoiseSVN

2010-04-21 12:57:33

RAC负载均衡配置

2017-01-11 10:38:17

MySQL客户端代码

2009-08-21 16:14:52

服务端与客户端通信

2021-04-30 08:19:32

SpringCloud客户端负载Ribbo

2010-03-18 15:44:22

VSTS 2010VS 2010

2021-09-22 15:46:29

虚拟桌面瘦客户端胖客户端
点赞
收藏

51CTO技术栈公众号