Socket IO工具类:

  1. package com.test.util;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.Socket;
  9.  
  10. public class SocketIO{
  11. public static DataInputStream getInput(Socket socket) throws IOException{
  12. //接收缓存区大小,socket获取输入流之前设置
  13. socket.setReceiveBufferSize(10);
  14. InputStream input = socket.getInputStream();
  15. return new DataInputStream(input);
  16. }
  17.  
  18. public static DataOutputStream getOutput(Socket socket) throws IOException{
  19. //发送缓存区大小,socket获取输出流之前设置
  20. socket.setSendBufferSize(10);
  21. OutputStream output = socket.getOutputStream();
  22. return new DataOutputStream(output);
  23. }
  24. }

如果传输数据量较大,则应配置较大缓存区,以减少数据传输次数,提高数据传输效率

如果传输数据量较小并且比较频繁,则应配置较小缓存,以提高通信速度

Socket Client客户端:

  1. package com.test.client;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.InetSocketAddress;
  7. import java.net.Socket;
  8. import java.net.SocketAddress;
  9.  
  10. import org.apache.log4j.Logger;
  11.  
  12. import com.test.util.SocketIO;
  13.  
  14. public class Client {
  15. static Logger logger = Logger.getLogger(Client.class);
  16. private int port = 10000;
  17. private String host = "127.0.0.1";
  18. private Socket socket;
  19.  
  20. public Client(){
  21. try {
  22. socket = new Socket();
  23. //关闭socket时,立即释放socket绑定端口以便端口重用,默认为false
  24. socket.setReuseAddress(true);
  25. //关闭传输缓存,默认为false
  26. socket.setTcpNoDelay(true);
  27. //如果输入流等待1000毫秒还未获得服务端发送数据,则提示超时,0为永不超时
  28. socket.setSoTimeout(10000);
  29. //关闭socket时,底层socket不会直接关闭,会延迟一会,直到发送完所有数据
  30. //等待10秒再关闭底层socket连接,0为立即关闭底层socket连接
  31. socket.setSoLinger(true, 10);
  32. //设置性能参数,可设置任意整数,数值越大,相应的参数重要性越高(连接时间,延迟,带宽)
  33. socket.setPerformancePreferences(3, 2, 1);
  34. SocketAddress address = new InetSocketAddress(host, port);
  35. //socket创建超时时间为1000毫秒
  36. socket.connect(address, 10000);
  37.  
  38. logger.info("client ip:"+socket.getLocalAddress());
  39. logger.info("client port:"+socket.getLocalPort());
  40. logger.info("servetr ip:"+socket.getInetAddress());
  41. logger.info("servetr port:"+socket.getPort());
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. logger.error("Cilent socket establish failed!");
  45. }
  46. logger.info("Client socket establish success!");
  47. }
  48.  
  49. public void request(){
  50. try{
  51. DataOutputStream output = SocketIO.getOutput(socket);
  52. DataInputStream input = SocketIO.getInput(socket);
  53.  
  54. String question = "your name?";
  55. byte[] bytes = question.getBytes("utf-8");
  56. int len = bytes.length;
  57. output.writeInt(len);
  58. output.write(bytes);
  59.  
  60. len = input.readInt();
  61. bytes = new byte[len];
  62. input.read(bytes);
  63.  
  64. logger.info("server answer:"+new String(bytes,"utf-8"));
  65. }catch(Exception e){
  66. e.printStackTrace();
  67. logger.error("client request error");
  68. }finally{
  69. if(null != socket){
  70. try{
  71. socket.close();
  72. }catch(Exception e){
  73. e.printStackTrace();
  74. logger.error("socket close error");
  75. }
  76. }
  77. }
  78. }
  79.  
  80. public static void main(String[] args){
  81. Client client = new Client();
  82. client.request();
  83. }
  84. }

Socket Server服务端:

  1. package com.test.server;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.net.InetSocketAddress;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8.  
  9. import org.apache.log4j.Logger;
  10.  
  11. import com.test.util.SocketIO;
  12.  
  13. public class Server {
  14. static Logger logger = Logger.getLogger(Server.class);
  15. private int queueSize = 10;
  16. private int port = 10000;
  17. private ServerSocket serverSocket;
  18.  
  19. public Server(){
  20. try{
  21. serverSocket = new ServerSocket();
  22. //关闭serverSocket时,立即释放serverSocket绑定端口以便端口重用,默认为false
  23. serverSocket.setReuseAddress(true);
  24. //accept等待连接超时时间为1000毫秒,默认为0,永不超时
  25. //serverSocket.setSoTimeout(10000);
  26. //为所有accept方法返回的socket对象设置接收缓存区大小,单位为字节,默认值和操作系统有关
  27. serverSocket.setReceiveBufferSize(128*1024);
  28. //设置性能参数,可设置任意整数,数值越大,相应的参数重要性越高(连接时间,延迟,带宽)
  29. serverSocket.setPerformancePreferences(3, 2, 1);
  30. //服务端绑定至端口,10为服务端连接请求队列长度
  31. serverSocket.bind(new InetSocketAddress(port), queueSize);
  32. }catch(Exception e){
  33. e.printStackTrace();
  34. logger.error("Server establish error!");
  35. }
  36. logger.info("Server start up!");
  37. }
  38.  
  39. public void service(){
  40. while(true){
  41. Socket socket = null;
  42. try{
  43. //从连接请求队列中取出一个客户连接请求,创建与客户连接的socket对象
  44. //如果队列中没有请求,accept方法就会一直等待
  45. socket = serverSocket.accept();
  46.  
  47. DataOutputStream output = SocketIO.getOutput(socket);
  48. DataInputStream input = SocketIO.getInput(socket);
  49.  
  50. int len = input.readInt();
  51. byte[] bytes = new byte[len];
  52. input.read(bytes);
  53.  
  54. String request = new String(bytes, "utf-8");
  55.  
  56. logger.info("client request:"+request);
  57.  
  58. String answer = "not supported";
  59. if(request.equals("your name?")){
  60. answer = "server";
  61. }
  62. bytes = answer.getBytes("utf-8");
  63. len = bytes.length;
  64. output.writeInt(len);
  65. output.write(bytes);
  66. }catch(Exception e){
  67. e.printStackTrace();
  68. logger.error("Server run exception!");
  69. }
  70. }
  71. }
  72.  
  73. public static void main(String[] args) {
  74. Server server = new Server();
  75. server.service();
  76. }
  77. }

log4j.properties日志设置:

  1. log4j.rootLogger=info,logOutput
  2.  
  3. #log console out put
  4. log4j.appender.logOutput=org.apache.log4j.ConsoleAppender
  5. log4j.appender.logOutput.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.logOutput.layout.ConversionPattern=%p%d{[yy-MM-dd HH:mm:ss]}[%c] -> %m%n

Client端日志:

  1. INFO[13-10-10 10:04:23][com.test.client.Client] -> client ip:/127.0.0.1
  2. INFO[13-10-10 10:04:23][com.test.client.Client] -> client port:52362
  3. INFO[13-10-10 10:04:23][com.test.client.Client] -> servetr ip:/127.0.0.1
  4. INFO[13-10-10 10:04:23][com.test.client.Client] -> servetr port:10000
  5. INFO[13-10-10 10:04:23][com.test.client.Client] -> Client socket establish success!
  6. INFO[13-10-10 10:04:23][com.test.client.Client] -> server answer:server

Server端日志:

  1. INFO[13-10-10 10:04:19][com.test.server.Server] -> Server start up!
  2. INFO[13-10-10 10:04:23][com.test.server.Server] -> client request:your name?

PS:

这里要特别说明一下DataInputStream这个类的readShort方法:

  1. public final short readShort() throws IOException {
  2. int ch1 = in.read();
  3. int ch2 = in.read();
  4. if ((ch1 | ch2) < 0)
  5. throw new EOFException();
  6. return (short)((ch1 << 8) + (ch2 << 0));
  7. }

可以看到是先读高位,再读低位

再来看下DataOutputStream这个类的writeShort方法:

  1. public final void writeShort(int v) throws IOException {
  2. out.write((v >>> 8) & 0xFF);
  3. out.write((v >>> 0) & 0xFF);
  4. incCount(2);
  5. }

可以看到是先写高位,再写低位

如果传输Short类型数据(其它类型数据相同)时,要求先传低位,再传高位,则不能使用自带的方法

将数据转为低位在前高位在后的字节数组,然后传输整个数组即可

  1. public void write(byte b[]) throws IOException {
  2. write(b, 0, b.length);
  3. }
  1. public void write(byte b[], int off, int len) throws IOException {
  2. if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
  3. throw new IndexOutOfBoundsException();
  4.  
  5. for (int i = 0 ; i < len ; i++) {
  6. write(b[off + i]);
  7. }
  8. }

Java Socket简例的更多相关文章

  1. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  2. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  3. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  4. 深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  5. Java Socket Server的演进 (一)

    最近在看一些网络服务器的设计, 本文就从起源的角度介绍一下现代网络服务器处理并发连接的思路, 例子就用java提供的API. 1.单线程同步阻塞式服务器及操作系统API 此种是最简单的socket服务 ...

  6. 《程序设计教学法--以Java程序设计为例》

    <程序设计教学法--以Java程序设计为例> 当老师上的第一门课就是<Java程序设计>,工作以来,断断续续上了近十次课了吧.十几年来,教材.课程内容.教学方法.教学手段不断改 ...

  7. Java Socket编程题库

    一.    填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...

  8. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  9. 如何为可扩展系统进行Java Socket编程

    从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...

随机推荐

  1. php include include_once require require_once 的区别与联系

    一.require 与 include 的区别: The require() function is identical to include(), except that it handles er ...

  2. bzoj1007

    其实吧,就是一个半平面交,而且不用考虑转回来的情况,所以只要极角排序然后用栈即可给的是点斜式,比极角很方便至于完整版的半平面交还没写过,看到再说吧 ..] of longint; v:..] of b ...

  3. Google Chrome中的高性能网络(二)

    Chrome Predictor的预测功能优化 Chrome会随着使用变得更快. 它这个特性是通过一个单例对象Predictor来实现的.这个对象在浏览器内核进程(Browser Kernel Pro ...

  4. jquery如何选择带有多个class的元素

    依次过滤$(“.good”).filter(“.list”).filter(“.Card”) 属性选择$(“[class='good list Card']“);此处 顺序必须一致才行 直接直接用 $ ...

  5. eclipse简单注释规范

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template Types/*** @ClassName: ${t ...

  6. Java JDK8 安装及环境变量配置

    步骤: 1.下载JDK 2.安装 3.配置环境变量 注意: 1.在选择安装路径时,不要选择C盘或D盘下的[Program Files]目录.此目录名中有空格,会导致配置不成功. 参照链接: http: ...

  7. 拉普拉斯特征图降维及其python实现

    这种方法假设样本点在光滑的流形上,这一方法的计算数据的低维表达,局部近邻信息被最优的保存.以这种方式,可以得到一个能反映流形的几何结构的解. 步骤一:构建一个图G=(V,E),其中V={vi,i=1, ...

  8. HW5.11

    public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...

  9. POJ1423 - Big Number(Stirling公式)

    题目大意 求N!有多少位 题解 用公式直接秒杀... 代码: #include<iostream> #include<cmath> using namespace std; # ...

  10. HDU3466-Proud Merchants(01背包变形)

    需要排序的01背包. 这种题排序时只需要考虑两个怎么排,重载小于号就可以了. 需要注意的是,如果一个物品你想先放进背包里,那么你排序是要放到后面!01背包的放置顺序的倒着的! 看到别人的博客都只是比较 ...