<分布式程序设计> 读书笔记二
二了解socket编程1内部通信方式2socketSocket与文件描述符一样,可以打开/读/写/关闭在unix系统中,端口号0-1023预留给root和superuserSocket类型sock_stream字节流通信Socket_dcram数据报文传输Socket_ram对信息传输进行高级控制java不支持3tcp/ipudp/ip通信数据报通信协议如:...
二了解socket编程
1内部通信方式
2socket
Socket与文件描述符一样,可以打开/读/写/关闭
在unix系统中,端口号0-1023预留给root和superuser
Socket类型
sock_stream字节流通信
Socket_dcram数据报文传输
Socket_ram对信息传输进行高级控制java不支持
3tcp/ipudp/ip通信
数据报通信协议如:udp无联接协议
流通信协议tcp协议面向连接的协议
Udp与tcp
Udp需要发送本地描述符和接收方地址,数据报不能超过64kb,不能保证接收方按顺序接收,应用场景:客户服务器,程序需要广播,或希望开销较小
Tcp需要建立联接,应用场景:远程登录.FTP,
4客户服务器通信
5使用java进行socket进行编程
Socket和datagramSocket
数据流
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实例
使用datagramSocket的send()和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地址转换

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