当前位置: 首页 > >

网络编程一(IP,TCP和UDP, DatagramSocket与DatagramPacket,TCP传输)

发布时间:

?


一.网络编程(IP地址)



1.网络通讯要素

??1)IP地址:

??网络中设备的标识

??不易记忆,可用主机名

??本地回环地址:127.0.0.1 主机名:localhost

??2)端口号

??用于标识进程的逻辑地址,不同进程的标识

??有效端口:0~65535,其中0~1024系统使用或保留端口。

??3)传输协议

??通讯的规则

??常见协议:TCP,UDP

?


2.InetAddress类(java.net包)

??1)此类表示互联网协议 (IP) 地址。?

??IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,

??UDP 和 TCP 协议都是在它的基础上构建的

??InetAddress 的实例包含 IP 地址,还可能包含相应的主机名

??(取决于它是否用主机名构造或者是否已执行反向主机名解析)。?

??2)方法摘要?

??boolean equals(Object obj)?

?? ? 将此对象与指定对象比较。?

??byte[] getAddress()?

?? ? 返回此 InetAddress 对象的原始 IP 地址。?

??static InetAddress getByName(String host)?

?? ? 在给定主机名的情况下确定主机的 IP 地址。?

??String getHostAddress()?

?? ? 返回 IP 地址字符串(以文本表现形式)。?

??String getHostName()?

?? ? 获取此 IP 地址的主机名。?

??static InetAddress getLocalHost()?

?? ? 返回本地主机。?

??String toString()?

?? ? 将此 IP 地址转换为 String。

??static InetAddress getLocalHost()?

?? ? 返回本地主机。

??static InetAddress[] getAllByName(String host)?

?? ? 在给定主机名的情况下,根据系统上配置的名称服务返* IP 地址所组成的数组。

?3.UnknownHostException异常:

??IPDemo.java:7: 未报告的异常 java.net.UnknownHostException;必须对其进行捕捉或声

??明以便抛出

?? ? InetAddress i = InetAddress.getLocalHost();

?


二.网络编程(TCP和UDP)


?


?



?TCP和UDP

?1)UDP:

??将数据及源和目的封装成数据包中,不需要建立连接。

??每个数据包的大小限制在64K内

??因无连接,是不可靠协议

??不需要建立连接,速度快

?2)TCP:

??建立连接,形成传输数据的通道。

??在连接中进行大量数据传输

??通过三次握手完成连接,是可靠协议

??必须建立连接,效率会稍低。

?3)应用:UDP如QQ聊天,视频会议等

?? ? ?TCP如下载等

?4)举例:UDP如同报话机。

?? ?TCP如同打固定电话。

?


三.网络编程(Socket)


?


?



1.Socket

??Socket就是为网络服务提供的一种机制。

??通信的两端都有Socket.

??网络通信其实就是Socket间的通信。

??数据在两个Socket间通过IO传输。

2.UDP传输

??DatagramSocket与DatagramPacket

??建立发送端,接收端

??建立数据包。

??调用Socket的发送接收方法。

??关闭Socket.

3.DatagramSocket类(java.net包)

??1)此类表示用来发送和接收数据报包的套接字。?

??数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。

??从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。?


?

??在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。

??在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

??2)构造方法摘要?

??DatagramSocket()?

?? ? 构造数据报套接字并将其绑定到本地主机上任何可用的端口。?

??protected ?DatagramSocket(DatagramSocketImpl impl)?

?? ? 创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。?

??DatagramSocket(int port)?

?? ? 创建数据报套接字并将其绑定到本地主机上的指定端口。?

??DatagramSocket(int port, InetAddress laddr)?

?? ? 创建数据报套接字,将其绑定到指定的本地地址。?

??DatagramSocket(SocketAddress bindaddr)?

?? ? 创建数据报套接字,将其绑定到指定的本地套接字地址。?

??3)方法摘要?

??void receive(DatagramPacket p)?

?? ? 从此套接字接收数据报包。?

??void send(DatagramPacket p)?

?? ? 从此套接字发送数据报包。?

??void close()?

?? ? 关闭此数据报套接字。?

??void connect(InetAddress address, int port)?

?? ? 将套接字连接到此套接字的远程地址。?

4. DatagramPacket类(java.net包)

??1)此类表示数据报包

??2)构造方法摘要?

??DatagramPacket(byte[] buf, int length)?

?? ? 构造 DatagramPacket,用来接收长度为 length 的数据包。?

??DatagramPacket(byte[] buf, int length, InetAddress address, int port)?

?? ? 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。?

??3)方法摘要?

??InetAddress getAddress()?

?? ? 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。?

??byte[] getData()?

?? ? 返回数据缓冲区。?

??void setData(byte[] buf)?

?? ? 为此包设置数据缓冲区。

??void setLength(int length)?

?? ? 为此包设置长度。?

??void setPort(int iport)?

?? ? 设置要将此数据报发往的远程主机上的端口号。?

??int getLength()?

?? ? 返回将要发送或接收到的数据的长度。?

??int getPort()?

?? ? 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。?

5 需求:通过UDP传输方式,将一段文字数据发送出去。

??定义udp的发送端

??思路:

??1)建立udpsocket服务。

??2)提供数据,并将数据封装到数据包中。

??3)通过socket服务的发送功能,将数据包发出去。

??4)关闭资源。

?



6.Udp-接收端

?

/*
思路:
1)定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
方便于明确哪些数据过来该应用程序可以处理。
2)定义一个数据包,因为要存储接收到的字节数据。
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3)通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4)通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5)关闭资源。
*/
class UdpSend
{
public static void main(String[] args)
{
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));

String line =null;
while((line = bufr.readLine())!= null)
{
if("886".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
ds.send(dp);
}
ds.close();
}
}
class UdpReceive
{
public static void main(String[] args)
{
DatagramSocket ds = new DatagramSocket(10001);
while(true)
{
byte buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getInetAddress.getHostAddress();
String data =new String(dp.getData(),dp.getLength());
System.out.println(ip+"::"+data);
}
}
}


?




?


?


?



1.TCP传输

??Socket和ServerSocket

??建立客户端和服务器端

??建立连接后,通过Socket中的IO流进行数据的传输

??关闭socket.

??同样,客户端与服务器端是两个独立的应用程序。

2.类 Socket(java.net )

??1)此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点

??2)构造方法摘要?

??Socket()?

?? ? 通过系统默认类型的 SocketImpl 创建未连接套接字?

??Socket(InetAddress address, int port)?

?? ? 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。?

??Socket(InetAddress address, int port, InetAddress localAddr, int localPort)?

?? ? 创建一个套接字并将其连接到指定远程地址上的指定远程端口。

??Socket(String host, int port)?

?? ? 创建一个流套接字并将其连接到指定主机上的指定端口号。

??Socket(String host, int port, InetAddress localAddr, int localPort)?

?? ? 创建一个套接字并将其连接到指定远程主机上的指定远程端口。?

??3)方法摘要?

??void bind(SocketAddress bindpoint)?

?? ? 将套接字绑定到本地地址。?

??void close()?

?? ? 关闭此套接字。?

??void connect(SocketAddress endpoint)?

?? ? 将此套接字连接到服务器。?

??void connect(SocketAddress endpoint, int timeout)?

?? ? 将此套接字连接到服务器,并指定一个超时值。?

??InetAddress getInetAddress()?

?? ? 返回套接字连接的地址。?

??InputStream getInputStream()?

?? ? 返回此套接字的输入流。?

??OutputStream getOutputStream()?

?? ? 返回此套接字的输出流。?

??int getPort()?

?? ? 返回此套接字连接到的远程端口。?

??String toString()?

?? ? 将此套接字转换为 String。?

3.类 ServerSocket(java.net)

??1)此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

??2)构造方法摘要?

??ServerSocket()?

?? ? 创建非绑定服务器套接字。?

??ServerSocket(int port)?

?? ? 创建绑定到特定端口的服务器套接字。?

??ServerSocket(int port, int backlog)?

?? ? 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。?

??ServerSocket(int port, int backlog, InetAddress bindAddr)?

?? ? 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。?

??3)方法摘要?

??Socket accept()?

?? ? 侦听并接受到此套接字的连接。?

??void close()?

?? ? 关闭此套接字。

??void bind(SocketAddress endpoint)?

?? ? 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。?

??void bind(SocketAddress endpoint, int backlog)?

?? ? 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。?

??String toString()?

?? ? 作为 String 返回此套接字的实现地址和实现端口。 ? ??



?


?


?



1.演示tcp的传输的客户端和服务端的互访。

?需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

?客户端:

?1.建立socket服务,指定要连接主机和端口。

?2.获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。

?3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印。

?4.关闭客户端资源。

?

class TcpClient
{
public static void main(String[] args)
{
Socket s = new Socket("127.0.0.1",10001);
OutpuStream out = s.getOutpuStream;
out.write("客户端发送来的数据".getBytes());
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len);
s.close();
}
}
class TcpServer
{
public static void main(String[] args)
{
ServerSocket ss = new ServerSocket(10001);
Socket s = ss.accept();
String ip = s.getInetAddress.getHostAddress();
System.out.println(ip+"....connected");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len);
OutpuStream out = s.getOutputStream();
out.write("服务端已经收到".getBytes());
s.close();
ss.close();
}
}


2.需求:建立一个文本转换服务器。

?

/*
需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。
而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流。
*/
class TransClient
{
public static void main(String[] args)
{
Socket s =new Socket("127.0.0.1",10002);
//键盘录入
BuffereReader bufr =
new BuffereReader(new InputStreamReader(System.in));
String line = null;
//获取网络输出流
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//获取网络输入流
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream());
while((line = bur.readLine())!= null)
{
if("over".equals(line))
break;
out.println(line);
String str = bufIn.readLine();
System.out.println("server:"+str);
}
}
}

class TransServer
{
public static void main(String[] args)
{
ServerSocket ss = new ServerSocket(10002);
Socket s = ss.accept();
String ip = s.getInetAddress.getHostAddress();
System.out.println(ip+".....is connected!");
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream());
PrintWriter out = new PrintWriter(s.getOutputStream());
String line = null;
while((line = bufIn.readLine())!= null)
{
out.println(line.toUpperCase());
}
ss.close();
}
}


3.TCP复制文件

?

/*
TCP复制文件
Socket类的方法(用于加结束标记):
void shutdownInput()
此套接字的输入流置于“流的末尾”。
void shutdownOutput()
禁用此套接字的输出流。
注:用over作标记容易重复
*/
class CopyClient
{
public static void main(String[] args)
{
Socket s = new Socket("127.0.0.1",10004);
//读取一个文件。
BufferedReader bufr =
new BufferedReader(new FileReader("javalist.txt"));
PrintWriter out = new PrintWriter(s.getOutputStream());
String line = null;
while((line = bufr.readLine())!= null)
{
out.println(line);
}
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream());
String str = bufIn.readLine();
System.out.println(str);
s.close();
}
}

class CopyServer
{
public static void main(String[] args)
{
ServerSocket ss =new ServerSocket(10003);
Socket s = ss.accept();
String ip = s.getInetAddress.getHostAddress();
System.out.println(ip+"....is connected!");
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream());
PrintWriter pw = new PrintWriter(new FileWriter("server.txt");
String line = null;
while((line =bufIn.readLine())!= null)
{
pw.println(line);
}
PrintWriter out = new PrintWriter(s.getOutputStream());
out.write("上传成功".getBytes());
ss.close();
}
}


?


?



友情链接: hackchn文档网 营销文档网 爱linux网 爱行业网 时尚网