导航:首页 > 编程语言 > socketjava通信协议

socketjava通信协议

发布时间:2025-01-14 14:24:34

『壹』 java Socket 底层是怎样基于TCP/IP 实现的

首先必须明确:TCP/IP模型中有四层结构:
应用层(Application Layer)、传输层(Transport Layer)、网络层(Internet Layer )、链路层(LinkLayer)
其中Ip协议(Internet Protocol)是位于网络层的,TCP协议时位于传输层的。通过Ip协议可以使可以使两台计算机使用同一种语言,从而允许Internet上连接不同类型的计算机和不同操作系统的网络。Ip协议只保证计算机能够接收和发送分组数据。 当计算机要和远程的计算机建立连接时,TCP协议会让他们建立连接:用于发送和接收数据的虚拟电路。

在JAVA中,我们用 ServerSocket、Socket类创建一个套接字连接,从套接字得到的结果是一个InputStream以及OutputStream对象,以便将连接作为一个IO流对象对待。通过IO流可以从流中读取数据或者写数据到流中,读写IO流会有异常IOException产生。

套接字或插座(socket)是一种软件形 式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。JAVA 有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;Socket,客户端用它初始一次连接。侦听套接字只能接收新的 连接请求,不能接收实际的数据包,即ServerSocket不能接收实际的数据包。
套接字是基于TCP/IP实现的,它是用来提供一个访问TCP的服务接口,或者说套接字socket是TCP的应用编程接口API,通过它应用层就可以访问TCP提供的服务。
在JAVA中,我们用 ServerSocket、Socket类创建一个套接字连接,从套接字得到的结果是一个InputStream以及OutputStream对象,以便 将连接作为一个IO流对象对待。通过IO流可以从流中读取数据或者写数据到流中,读写IO流会有异常IOException产生。

『贰』 请教大神,java socket接口,TCP长连接,怎么解析和发送一种协议格式数据包

建议你下载我的java版本至尊聊天程序源码下去参考。在CSDN或网络上找吧。
协议完全回自己来定制,答数据以字节发送,以什么开始,什么结束,中间分几段,都可由你自己来定,接收时,就按你定的规则来解析并还原。比如:我要的协议格式为
:>10:3:5:content:<
:>表示一条消息的开始。
10表示总消息长度(只是个代数,有可能不是10,需要你在发送前计算)
:为分隔符
3为头消息长度,也可能不是3
5表示后面的消息内容长度,甚至还可以定制,是否有图片,从多少位置开始是图片的数据。
:<表示结束标志
没有人限制你的协议。
关键一点:你在收取的时候,一定要注意数据可能会粘包,这个问题很头疼的。因为一般都是多线程模式。这需要你自己来处理它。一言难清。可以参考我的聊天程序。

『叁』 java socket局域网传输文件丢包严重

这方面的 我也做过,建议用DataInputStream 做底层,然后用其他高级流,做装饰,这样穿不会丢失,我以前也做了一个如果要源代码,给我留言,不会丢失文件的

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

以下分四点进行描述:

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);
//出错,打印出错信息
}
}
}

『伍』 java tcp socket 通信问题

这两个问题都可以通过消息机制来解决,
消息机制就是双方约定的通信语言。

首先:你需要自定义一份双方约定的通信机制,
其次: 对每个连进来的客户按用户ID或IP进行编号存入哈希表,以方便索引用户的Socket通道。 每进来一个客户就 hashtable.put(user.name, socket);

最后:双方都还要有两个缓冲数组(可以是数组Object[],也可以是Vector,Arraylist,Hashtable都可以);

一个叫发送缓冲区,一个叫接收缓冲区。每一个都附带一个管理线程。
向客户端发送消息时,并不是马上就发送,而是将消息推入到发送缓冲区排队,
发送缓冲区的线程会每隔一小片时间后就扫描并 pop出一个可发送的消息。
分析这个消息的源发送者和目的发送者,然后hashtable的索引找到目的发送者的socket通道。并发送.

另一个叫接收缓冲区。 Socket的网络线程不断接收到客户的消息,但不是马上就处理,也不会自己亲自处理,而是压入接收缓冲队列等待缓冲队列来处理,自己休息片段又立马再去接收别的客户发过来的消息。 接收缓冲区有自己的线程,它每sleep一小片刻时间后就扫描队列中有无消息到达,如果有(网络线程刚压进一的),则可以采用监听器模式让监听器处理,如果不想那么复杂也可以自己处理, 会分析消息来源和去向,从去向中分析出将要发送给某人,但自己并不发送,而是直接压入到发送缓冲区(这里就接到前面的发送缓冲区介绍中去了)

最后是消息机制的设计。
我公司的游戏都是由我来设计通信机制,实现三网合一,即手机,PC,电视机顶盒三种客户端同玩一桌麻将游戏
一般java设计的游戏中设计如下:
一. 消息头 二.消息体

消息头设计格式如下: 1. 本消息包长度,以方便解析字节;2. 本消息类型TYPE:如一般消息,游戏消息,大厅消息,聊天消息;3.本消息命令类型COMMAND: 如登陆、个人资料修改、登出、聊天。。。。

消息体设计格式一般根据Type和command不同而有不同。 如聊天消息包含四个字段,String 聊天内容、 User 发送者、 User 接收者、Text文字排版信息

服务端SeverSocket收到这个消息后,压入接收缓冲区, 接收缓冲线程分析其中结构,根据Type和Command的类型实例化出相应消息类, 该消息类能自动将后面的字节流实例化自身的字段。从而得到接收方和发送方, 得到接收方后再将消息封装好压入到发送队列

这个结构除完全适合聊天系统以外,以后要加入新内容将会非常容易!

如果有什么疑问欢迎call我, 我不负责写代码,但可以指点你。 另外,我的回答记录中有用nio设计的聊天室BBS代码。也是帮一个学生做的。你可以看看

『陆』 java编程中,Socket通信是怎么实现的

java编程对于Socket之间的通信过程如下:

服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看一些服务端与客户端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//为了简单起见,所有的异常信息都往外抛
intport=8899;
//定义一个ServerSocket监听在端口8899上
ServerSocketserver=newServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客户端代码
Java代码publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//为了简单起见,所有的异常都直接往外抛
Stringhost="127.0.0.1";//要连接的服务端IP地址
intport=8899;//要连接的服务端对应的监听端口
//与服务端建立连接
Socketclient=newSocket(host,port);
//建立连接后就可以往服务端写数据了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//写完后要记得flush
writer.close();
client.close();
}

}
阅读全文

与socketjava通信协议相关的资料

热点内容
如何让网络信号好些 浏览:256
最常用的app都有哪些啊 浏览:443
javascript100 浏览:276
安卓版获取网络时间 浏览:993
文件存u盘就乱码 浏览:834
数据线坏了换一个多少钱 浏览:94
苹果电脑如何测试网络ping 浏览:633
没网络能重装系统吗 浏览:403
电话铃声我的文件在哪里保存 浏览:148
向往的生活第五季运动app是什么 浏览:765
ps怎么把pdf文件颜色改一下 浏览:458
苹果6解ld码多少钱 浏览:161
win101709教程 浏览:369
去广告qq下载地址 浏览:15
win10搜索框重新显示不出来 浏览:874
tomcat版本区别 浏览:475
appstore电脑版有什么好玩的游戏 浏览:544
南阳网站怎么推广 浏览:31
解套app什么用 浏览:682
安卓设置文件权限管理 浏览:451

友情链接