二了解socket编程

1内部通信方式

2socket

Socket与文件描述符一样,可以打开///关闭

unix系统中,端口号0-1023预留给rootsuperuser

Socket类型

sock_stream字节流通信

Socket_dcram数据报文传输

Socket_ram对信息传输进行高级控制java不支持

3tcp/ipudp/ip通信

数据报通信协议如:udp无联接协议

流通信协议tcp协议面向连接的协议

Udptcp

Udp需要发送本地描述符和接收方地址,数据报不能超过64kb,不能保证接收方按顺序接收,应用场景:客户服务器,程序需要广播,或希望开销较小

Tcp需要建立联接,应用场景:远程登录.FTP,

4客户服务器通信

5使用java进行socket进行编程

SocketdatagramSocket

数据流

inputStream

outputStream

Tcpsocket

打开socket

创建数据输入流

创建数据输出流

关闭socket

示例代码如下:

/**

*Copyright(C)2015

*

*FileName:TCPEchoClient.java

*

*Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*CreateTime:2015-1-15

*/

//PackageInformation

packagecn.yue.test.net;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.net.Socket;

importjava.net.SocketException;

importjava.net.UnknownHostException;

/**

*tcpsocket客户端

*

*@version

*

*@Description:

*

*@author<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*@since2015-1-15

*

*/

publicclassTCPEchoClient{

publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{

//控制台输入服务器地址,报文和端口

if((args.length<2)||(args.length>3)){

thrownewIllegalArgumentException("(parameter(s):<server><word>[<port>])");

}

Stringserver=args[0];

byte[]data=args[1].getBytes();

intservPort=(args.length==3)?Integer.parseInt(args[3]):7;

//创建socket

Socketsocket=newSocket(server,servPort);

System.out.println("connectingtoserver...sendingechostring");

InputStreamin=socket.getInputStream();

OutputStreamout=socket.getOutputStream();

//发送数据

out.write(data);

//接收数据

inttotalBytesRcvd=0;

intbytesRcvd;

while(totalBytesRcvd<data.length){

if((bytesRcvd=in.read(data,totalBytesRcvd,data.length-totalBytesRcvd))==-1){

thrownewSocketException("connectionclosedprematurely!");

}

totalBytesRcvd+=bytesRcvd;

}

System.out.println("received:"+newString(data));

socket.close();

}

}

/**

*Copyright(C)2015

*

*FileName:TCPEchoServer.java

*

*Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*CreateTime:2015-1-15

*/

//PackageInformation

packagecn.yue.test.net;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.net.ServerSocket;

importjava.net.Socket;

importjava.net.SocketAddress;

/**

*tcpsocket服务端程序

*

*@version

*

*@Description:

*

*@author<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*@since2015-1-15

*

*/

publicclassTCPEchoServer{

//用于接收数据的缓冲区

privatestaticfinalintBUFSIZE=32;

publicstaticvoidmain(String[]args)throwsIOException{

//从控制台接收端口号

if(args.length!=1){

thrownewIllegalArgumentException("parameter(s):<port>");

}

intservPort=Integer.parseInt(args[0]);

//

ServerSocketserverSocket=newServerSocket(servPort);

intreceiveMsgSize;

byte[]receiveBuf=newbyte[BUFSIZE];

//监听客户端请求

while(true){

SocketclientSocket=serverSocket.accept();

SocketAddressclientAddress=clientSocket.getRemoteSocketAddress();

System.out.println("handingclientas"+clientAddress);

InputStreamin=clientSocket.getInputStream();

OutputStreamout=clientSocket.getOutputStream();

while((receiveMsgSize=in.read(receiveBuf))!=-1){

//向客户端写入

out.write(receiveBuf,0,receiveMsgSize);

}

clientSocket.close();

}

}

}

Udpsocket

创建一个datagramSocket实例

使用datagramSocketsend()receive()来发送和接收数据

使用close关闭套接字

示例代码如下:

/**

*Copyright(C)2015

*

*FileName:UDPEchoClient.java

*

*Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*CreateTime:2015-1-15

*/

//PackageInformation

packagecn.yue.test.net;

importjava.io.IOException;

importjava.io.InterruptedIOException;

importjava.net.DatagramPacket;

importjava.net.DatagramSocket;

importjava.net.InetAddress;

importjava.net.SocketException;

importjava.net.UnknownHostException;

/**

*udpsocket客户端

*

*@version

*

*@Description:

*

*@author<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*@since2015-1-15

*

*/

publicclassUDPEchoClient{

//设置超时时间

privatestaticfinalintTIMEOUT=3000;

//重复发送次数

privatestaticfinalintMAXTRIES=5;

publicstaticvoidmain(String[]args)throwsIOException{

if((args.length<2)||(args.length>3)){

thrownewIllegalArgumentException("parameter(s)<server><word>[<port>]");

}

InetAddressserverAddress=InetAddress.getByName(args[0]);

byte[]bytesToSend=args[1].getBytes();

intserverPort=(args.length==3)?Integer.parseInt(args[2]):7;

//

DatagramSocketsocket=newDatagramSocket(serverPort,serverAddress);

socket.setSoTimeout(TIMEOUT);

DatagramPacketsendpacket=newDatagramPacket(bytesToSend,bytesToSend.length,serverAddress,serverPort);

DatagramPacketreceivePacket=newDatagramPacket(newbyte[bytesToSend.length],bytesToSend.length);

//发送包容易丢失,保持重发

inttries=0;

booleanreceivedResponse=false;

do{

socket.send(sendpacket);

try{

socket.receive(receivePacket);

//检查数据源

if(!receivePacket.getAddress().equals(serverAddress)){

thrownewIOException("receivedpacketfromanunknowsource");

}

receivedResponse=true;

}catch(InterruptedIOExceptione){

tries+=1;

System.out.println("timeout,"+(MAXTRIES-tries)+"moretries...");

}

}while((!receivedResponse)&&(tries<MAXTRIES));

if(receivedResponse){

System.out.println("received:"+newString(receivePacket.getData()));

}else{

System.out.println("noresponse--qivingup.");

}

socket.close();

}

}

/**

*Copyright(C)2015

*

*FileName:UDPEchoServer.java

*

*Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*CreateTime:2015-1-15

*/

//PackageInformation

packagecn.yue.test.net;

importjava.io.IOException;

importjava.net.DatagramPacket;

importjava.net.DatagramSocket;

/**

*udpsocket服务器端

*

*@version

*

*@Description:

*

*@author<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

*

*@since2015-1-15

*

*/

publicclassUDPEchoServer{

privatestaticfinalintECHOMAX=255;

publicstaticvoidmain(String[]args)throwsIOException{

//控制台输入端口号

if(args.length!=1){

thrownewIllegalArgumentException("parameter(s)<port>");

}

intserverPort=Integer.parseInt(args[0]);

DatagramSocketsocket=newDatagramSocket(serverPort);

DatagramPacketpacket=newDatagramPacket(newbyte[ECHOMAX],ECHOMAX);

while(true){

socket.receive(packet);

System.out.println("hadingclientan"+packet.getAddress()+"onport"+packet.getPort());

socket.send(packet);

packet.setLength(ECHOMAX);

}

}

}

多点传送socket

MulticastSocket此类应用于客户端,用监听服务器广播到多个客户的包

使用多点传送ip要使用基于upd协议

6greetings服务器实例

服务器程序

客户程序

以上两个程序同5所示代码

7解析internate地址

getName//取得机器的字符名

getIp//取得机器的ip地址

nsLookUp//根据主机名找ip,反之也可

IPtoName//ip地址转换

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐