---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
网络编程
网络模型
OSI参考模型
TCP/IP参考模型
网络通讯要素
IP地址 = 网络号码+主机地址
端口号;
定义通信规则。这个规则称为通信协议,国际组织定义了通用协议TCP/IP
网络模型:
TCP/IP模型
应用层
传输层
网际层
主机至网络层
TCP和UDP
UDP
将数据及源和目的封装成数据包中,不需要建立连接,每个数据报的大小在限制在64k内,因无连接,是不可靠协议,不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道。在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会稍低
三次握手:
第一次:我问你在么?
第二次:你回答在。
第三次:我反馈哦我知道你在。
Socket(UDP传输)
Socket就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输,玩Socket主要就是记住流程,代码查文档就行。
UDP传输:DatagramSocket与DatagramPacket
发送端:
建立DatagramSocket服务;提供数据,并将数据封装到字节数组中; 创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口, 通过Socket服务,利用send方法将数据包发送出去;关闭DatagramSocket和DatagramPacket服务。
接收端:
建立DatagramSocket服务,并监听一个端口;定义一个字节数组和一个数据包,同时将数组封装进数据包;通过DatagramPacket的receive方法,将接收的数据存入定义好的数据包;通过DatagramPacke关闭t的方法,获取发送数据包中的信息; 关闭DatagramSocket和DatagramPacket服务。
DatagramSocket
构造方法:
DatagramSocket();构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port) ;创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress addr); 创建数据报套接字,将其绑定到指定的本地地址。
方法摘要:
void close();关闭此数据报套接字。
InetAddress getInetAddress();返回地址。
InetAddress getLocalAddress();获取本地地址。
int getPort();返回端口。
void receive(DatagramPacket p);接收数据报包。
void send(DatagramPacket p);发送数据报包。
DatagramPacket
构造方法:
DatagramPacket(byte[] buf, int length) ;构造DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port);构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
方法:
InetAddress getAddress();返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData();返回数据缓冲区。
int getLength();返回将要发送或接收到的数据的长度。
int getPort();返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
例:
发送端:
class UDPSend {
public static void main(String[] args) throws Exception{
DatagramSocketd s = new DatagramSocket();
byte[] buf = "这是UDP发送端".getBytes();
DatagramPacket dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.253"),10000);
ds.send(dp);
ds.close();
}
}
接收端
class UDPRece{
public static void main(String[] args) throws Exception{
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中
String ip = dp.getAddress().getHosyAddress();//获取发送端的ip
String data = new String(dp.getData(),0,dp.getLength());//获取数据
int port = dp.getPort();//获取发送端的端口号
sop(ip+":"+data+":"+port);
ds.close();
}
}
例:UDP键盘录入数据,并发送给接收端
发送端:
class UDPSend {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));Stringline = null;
while((line= bufr.readLine())!=null) {
if("886".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.253"),10000);
ds.send(dp);
}
ds.close();
}
}
接收端:
class UDPRece {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10000);
while(true) {
byte[]buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中
String ip = dp.getAddress().getHosyAddress();//获取发送端的ip
String data = new String(dp.getData(),0,dp.getLength());//获取数据
int port = dp.getPort();//获取发送端的端口号
sop(ip+":"+data+":"+port);
ds.close();
}
}
}
TCP传输
Socket和ServerSocket
建立客户端和服务器端,建立连接后,通过Socket中的IO流进行数据的传输,关闭socket,同样,客户端与服务器端是两个独立的应用程序。
Socket
构造方法:
Socket() ;创建未连接套接字
Socket(InetAddress address, int port); 创建流套接字并指定 IP 地址,端口号。
Socket(String host, int port) ;创建流套接字并指定主机上的指定端口号。
方法:
void close();关闭此套接字。
InetAddress getInetAddress();返回连接的地址。
InputStream getInputStream() ;返回输入流。
OutputStream getOutputStream();返回输出流。
int getPort();返回远程端口。
void shutdownInput()此套接字的输入流置于“流的末尾”。
void shutdownOutput()禁用此套接字的输出流。
String toString() 将此套接字转换为 String。
ServerSocket
构造方法:
ServerSocket()创建非绑定服务器套接字。
ServerSocket(int port)创建绑定到特定端口的服务器套接字。
方法:
Socket accept()侦听并接受到此套接字的连接。
void close()关闭此套接字。
InetAddress getInetAddress()返回此服务器套接字的本地地址。
TCP传输流程:
客户端:
建立Socket服务,并制定要连接的主机和端口;
获取Socket流中的输出流OutputStream,将数据写入流中,通过网络发送给服务端;
获取Socket流中的输出流InputStream,获取服务端的反馈信息;
关闭资源。
服务端:
建立ServerSocket服务,并监听一个端口;
通过ServerSocket服务的accept方法,获取Socket服务对象;
使用客户端对象的读取流获取客户端发送过来的数据;
通过客户端对象的写入流反馈信息给客户端;
关闭资源;
示例:
客户端:
class TCPClient {
public static void main(String[] args){
Socket s = new Socket("192.168.1.253",10000);
OutputStream os = s.getOutputStream();
out.write("这是TCP发送的数据".getBytes());
s.close();
}
}
服务端:
class TCPServer {
public static void main(String[] args){
ServerSocket ss = new ServerSocket(10000);
Socket s= ss.accept();
String ip = s.getInetAddress().getHostAddress();
sop(ip);
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
sop(new String(buf,0,len));
s.close();
ss.close();
}
}
TCP:客户端给服务端发送数据,服务端接收到后反馈信息给客户端
客户端:
class TCPClient {
public static void main(String[] args) {
Sockets = new Socket("192.168.1.253",10000);
OutputStream os = s.getOutputStream();
out.write("这是TCP发送的数据".getBytes());
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
sop(new String(buf,0,len));
s.close();
}
}
服务端:
class TCPServer {
public static void main(String[] args) {
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
sop(ip);
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
sop(new String(buf,0,len));
OutputStream os = s.getOutputStream();
out.write("这是TCP发送的数据".getBytes());
s.close();
ss.close();
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>