问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用java socket来传输自定义的数据包?

发布网友 发布时间:2022-04-23 08:05

我来回答

2个回答

热心网友 时间:2022-06-18 02:50

以下分四点进行描述:

1,什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

2,Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
  (1) 创建Socket;
  (2) 打开连接到Socket的输入/出流;
  (3) 按照一定的协议对Socket进行读/写操作;
  (4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)

3,创建Socket
创建Socket
java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:
  Socket(InetAddress address, int port);
  Socket(InetAddress address, int port, boolean stream);
  Socket(String host, int prot);
  Socket(String host, int prot, boolean stream);
  Socket(SocketImpl impl)
  Socket(String host, int port, InetAddress localAddr, int localPort)
  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
  ServerSocket(int port);
  ServerSocket(int port, int backlog);
  ServerSocket(int port, int backlog, InetAddress bindAddr)
  其中address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和 bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。例如:学习视频网 http://www.xxspw.com
  Socket client = new Socket("127.0.01.", 80);
  ServerSocket server = new ServerSocket(80);
  注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
  在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。

4,简单的Client/Server程序
1. 客户端程序
  import java.io.*;
  import java.net.*;
  public class TalkClient {
    public static void main(String args[]) {
      try{
        Socket socket=new Socket("127.0.0.1",4700);
        //向本机的4700端口发出客户请求
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
        //由系统标准输入设备构造BufferedReader对象
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        //由Socket对象得到输出流,并构造PrintWriter对象
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //由Socket对象得到输入流,并构造相应的BufferedReader对象
        String readline;
        readline=sin.readLine(); //从系统标准输入读入一字符串
        while(!readline.equals("bye")){
        //若从标准输入读入的字符串为 "bye"则停止循环
          os.println(readline);
          //将从系统标准输入读入的字符串输出到Server
          os.flush();
          //刷新输出流,使Server马上收到该字符串
          System.out.println("Client:"+readline);
          //在系统标准输出上打印读入的字符串
          System.out.println("Server:"+is.readLine());
          //从Server读入一字符串,并打印到标准输出上
          readline=sin.readLine(); //从系统标准输入读入一字符串
        } //继续循环
        os.close(); //关闭Socket输出流
        is.close(); //关闭Socket输入流
        socket.close(); //关闭Socket
      }catch(Exception e) {
        System.out.println("Error"+e); //出错,则打印出错信息
      }
  }
}

 2. 服务器端程序
  import java.io.*;
  import java.net.*;
  import java.applet.Applet;
  public class TalkServer{
    public static void main(String args[]) {
      try{
        ServerSocket server=null;
        try{
          server=new ServerSocket(4700);
        //创建一个ServerSocket在端口4700监听客户请求
        }catch(Exception e) {
          System.out.println("can not listen to:"+e);
        //出错,打印出错信息
        }
        Socket socket=null;
        try{
          socket=server.accept();
          //使用accept()阻塞等待客户请求,有客户
          //请求到来则产生一个Socket对象,并继续执行
        }catch(Exception e) {
          System.out.println("Error."+e);
          //出错,打印出错信息
        }
        String line;
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         //由Socket对象得到输入流,并构造相应的BufferedReader对象
        PrintWriter os=newPrintWriter(socket.getOutputStream());
         //由Socket对象得到输出流,并构造PrintWriter对象
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
         //由系统标准输入设备构造BufferedReader对象
        System.out.println("Client:"+is.readLine());
        //在标准输出上打印从客户端读入的字符串
        line=sin.readLine();
        //从标准输入读入一字符串
        while(!line.equals("bye")){
        //如果该字符串为 "bye",则停止循环
          os.println(line);
          //向客户端输出该字符串
          os.flush();
          //刷新输出流,使Client马上收到该字符串
          System.out.println("Server:"+line);
          //在系统标准输出上打印读入的字符串
          System.out.println("Client:"+is.readLine());
          //从Client读入一字符串,并打印到标准输出上
          line=sin.readLine();
          //从系统标准输入读入一字符串
        }  //继续循环
        os.close(); //关闭Socket输出流
        is.close(); //关闭Socket输入流
        socket.close(); //关闭Socket
        server.close(); //关闭ServerSocket
      }catch(Exception e){
        System.out.println("Error:"+e);
        //出错,打印出错信息
      }
    }
  }

热心网友 时间:2022-06-18 02:50

自定义是什么意思?是指定义数据包的大小,还是数据包中内容的格式追问是的。。就是包括包头和包体都是自己定义的。。
字段名字节数类型描述
Total_Length4Integer为消息的总长度
Value 2 Integer消息操作的本地值
Sequence_ID2Integer序列号(从1开始计数)//包头部分;包体就是传输的实际内容

追答随便写了个没做测试,你看看,照我的思路想想
服务端
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(2345);
Socket socket = null;
while(true){
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is,16);
byte[] b = new byte[16];
while((bis.read(b))!=-1){
for(int i=0;i0){//16位78位没有定义
seq++;
if(len>7){
for(int j=0;j0){
b[j]=(byte)(m%2);
m=m/2;
j--;
}
while(j>=0){
b[j]=0;
j--;
}//end
for(int i=8;i<8+len;i++){//8-15
b[i] = bb[start];
start++;
}
len = 0;
}
int j = 5;//4 5
int temp = seq;
while(j!=3){
b[j]=(byte)(temp%2);
temp=temp/2;
j--;
}
while(j!=3){
b[j]=0;
j--;
}//end
bos.write(b);//发送数据包
}
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {e.printStackTrace();}}}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
QQ空间里的好多东西怎么删不掉阿 我想把QQ上的文件全删掉,为什么有的删不掉呢。 4M宽带为什么有1M的下载速度 有什么办法治疗牙结石?还有晚上牙龈出血?有什么食物可以补充营养?曾经... 红米Note2开机以后不显示桌面但是有图标下面三个键都不好使您知道怎么... 红米Note2,酷我音乐盒桌面歌词没有,已经设置了,悬浮窗什么的也点... 大神们, 帮忙把下面文字翻译成英文吧! 急~~~ 机器君就算了 多谢啊 O... DIN 54801-2006 是德国什么标准 我想问一下" high melt viscosity at low shear rates"是什么意思? 请问谁有《喜羊羊与灰太狼》中,灰太狼说的“我一定会回来的”,和懒羊... 网上的Java基于Socket文件传输示例,一个客户端一个服务器端一个socket的Util辅助类怎么运行起来啊 SOCKET 传输大文件应该怎么做 如何给socket.io和node.js做的即时通信系统加上点对点文件传输 socket聊天传文件时先把文件传到服务器还是自己传文件给客户 socket客户端传文件到服务器,IO流的操作 socket.io支持多大数据传输 如何使用socket.io发送二进制数据 苹果手机如何一次登陆两个? 你好请问对方的微信被封限制登录为什么以前看不到他的朋友圈这几天又看到了呢? 如何剪辑视频?要做一个电影配音 电影解说视频制作教程是怎么样的? 怀孕可以吃干贝吗 食用干贝需要注意什么? 干贝的营养价值 儿童可以吃干贝吗 吃干贝,对身体有什么好处?如题 谢谢了 请问吃干贝丁对健康有什么好处? 黄奶油与黄油,奶油的区别 小孩子经常吃干贝,对孩子的好处有哪些? 奶油和黄油的关系? 请问奶油和黄油有什么不同? QQ怎么把一个动态图加速? 怎样快速制作GIF图片,用什么软件最快 甲亢都有什么症状? 甲亢的明显症状? 做好了一个GIF图,如何让图片切换地更快一些? 甲亢有哪些症状表现? 制作GIF图片时 怎么能让他播放快点 甲亢患者会有什么症状? 怎么把动图速度调快? 甲亢的早期症状有哪些? PS怎么调整gif动图里不同的内容速度,比如这个动图有文字和图片,我想把... 甲亢症状有哪些? 要怎么做才能使GIF动图动快点??? 甲亢的症状有哪些? 我做的GIF图太慢了怎么快速调整帧速度 甲亢的临床表现有哪些? 请问甲亢病的早期症状是什么样的? 甲亢有什么症状? 甲亢的症状表现是什么呢? 电脑里的gif动图打开后,动图速度飞快 怎么处理???