本文梳理一个基础的java TCP消息通信,构造一个简单的Packet进行传输,代码如下:

  • Packet
public class Packet {
private String attribute; public Packet(String attr){
this.attribute = attr;
} public String getAttribute() {
return attribute;
}
public void setAttribute(String attribute) {
this.attribute = attribute;
}
}
  • 服务器端代码
public class App {

    private static final int PORT = 4000;

    public static void main(String[] args) throws IOException {

        ServerSocket listen = new ServerSocket(PORT);
Socket client = null;
while(true){
client = listen.accept();
new Thread(new ServerThread(client)).start();
}
}
}
public class ServerThread implements Runnable{

    private static final int BUFSIZE  =1024;
private Socket client = null; public ServerThread(Socket client){
this.client = client;
} @Override
public void run() {
try {
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream(); byte[] buffer = new byte[BUFSIZE]; while (in.read(buffer) != -1) {
//判断包头
if(buffer[0] == 0x01 && buffer[1] == 0x02){
byte[] tmp = new byte[BUFSIZE];
int index = 0;
for(int i = 2; i < buffer.length; i++){
tmp[index++] = buffer[i];
} Packet packet = new Packet(new String(tmp,"GB2312")); System.out.println(packet.getAttribute());
}else{
System.out.println("消息格式不正确");
}
} out.close();
in.close(); } catch (IOException e) {
e.printStackTrace();
}
}
}
  • 客户端代码
public class App {

    private static final int PORT = 4000;
private static final int BUFSIZE =1024; public static void main(String[] args) throws IOException { Socket client = new Socket("127.0.0.1", PORT); InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream(); Packet packet = new Packet("类型参数2345"); byte[] output = new byte[BUFSIZE];
output[0] = 0x01;
output[1] = 0x02; int index = 2;
//若增加包长度字段,则可实现packet的分包、组包
byte[] tmp1 = packet.getAttribute().getBytes();
for(int i= 0; i < tmp1.length; i++){
output[index++] = tmp1[i];
} out.write(output); byte[] buffer = new byte[BUFSIZE];
while (in.read(buffer) != -1) {
System.out.println(new String(buffer, "GB2312"));
} out.close();
in.close();
client.close(); }
}

java 网络(socket)的更多相关文章

  1. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

  2. Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html 使用TCP/IP的套接字(Socket)进行通信 套接字Socke ...

  3. 【java】网络socket编程简单示例

    package 网络编程; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; ...

  4. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  5. Java基础知识➣网络Socket(六)

    概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之 ...

  6. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

  7. java网络编程ServerSocket类 和Socket类的常用构造方法及其方法

    Socket类Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号.Socket(String host, int po ...

  8. JAVA I/O(四)网络Socket和ServerSocket

    <Thinking in Enterprise Java>中第一章描述了用Socket和Channel的网络编程,核心即为Socket和Channel,本文简单讲述Socket的应用. S ...

  9. 如何使用socket进行java网络编程(三)

    本篇文章继续记录java网络通讯编程的学习.在本系列笔记的第一篇中曾经记录过一个项目中的程序,当时还处于项目早期,还未进入与第三方公司的联调阶段,笔者只是用java写了一个client程序模拟了一下第 ...

  10. 如何使用socket进行java网络编程(二)

    通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...

随机推荐

  1. POJ 3469 Dual Core CPU 最大流

    划分成两个集合使费用最小,可以转成最小割,既最大流. //#pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...

  2. M2事后分析汇报总结

    学霸网站项目Postmortem结果 M2之于M1的改进 文档和问答的整合 完成webservice 完成数据库触发器设计与完整性约束依赖(大规模) 优化学霸UI 资源的搜索 外部问题的搜索 文档的上 ...

  3. ESM335x Linux输出脉冲计数

    1.综述   ESM335X具有4路PWM输出,其中PWM1和PWM2除了可以用于产生标准的PWM信号,现已支持输出脉冲计数功能,可以在应用程序中设置脉冲个 数,当输出脉冲个数达到指定值时,驱动程序自 ...

  4. Springmvc mybatis

    http://www.icoolxue.com/album/show/216 07

  5. Windows netstat 查看端口、进程占用

    目标:在Windows环境下,用netstat命令查看某个端口号是否占用,为哪个进程所占用. (1)查看该端口被那个PID所占用;方法一:有针对性的查看端口,在命令行下,使用命令netstat –an ...

  6. EF支持mysq相关配置数码

    最近,项目考虑到安装部署方面:希望可以使用MySQL数据库,毕竟比较小巧.方便. 后来,自己通过测试发现EF可以支持mysql数据库,而且也可以通过codefirst模式进行开发:使用起来,跟sqls ...

  7. 其他浏览器(firefox,chrome)可以上网 ie(Internet Explorer)无法上网 解决方法

    http://blog.csdn.net/andywangcn/article/details/8945366

  8. checkbox标签已有checked=checked属性但是不显示勾选

    点击全选按钮,选中下面的列表,再次点击取消选择. 第一次的使用的方法是$("input[name=xxx]").attr('checked',true); 但是往往刷新页面第一次点 ...

  9. 使用内存虚拟硬盘 提高ArcGIS server并发性能的一种方法

    1 问题提出 1.1 概述 提高ArcGIS server并发性能的方法很多,本文讨论在用户硬件足够强大的情况下(主要是内存足够大),使用内存模拟硬盘来提高数据的读取效率,以达到提高ArcGIS se ...

  10. js获取div相对屏幕的坐标位置

    1:div相对屏幕的坐标位置 function getDivPosition(div){ var x = div.getBoundingClientRect().left; var y = div.g ...