Java中的网络编程也是通过socket来完成的,Java中的几个Socket类:
ServerSocket类:它表示监听Socket,用于TCP协议中双方建立连接。
Socket类:它是用于TCP通信的Socket类。他是TCP通信中真正用于实现双方通信类。
DatagramSocket类:用于UDP双方的通信套接字。
(一)TCP编程:
步骤描述:
服务器端:
1.创建一个ServerSocket类的对象ss,帮定到指定的端口上;
2.调用ss.accept()方法来等待客户端的连接请求,当请求到来时返回一个用于通信的套接字,即一个Socket类的对象s;
3.调用s.getOutputStream()返回一个输出流对象os,用于向客户端发送信息;
4.调用s.getInputStream()返回一个输入流对象is,用于从客户端接收信息;
5.通信;
客户端:
1.创建一个Socekt类的对象s用于通信,并将其帮定到指定IP地址和端口上;
2.调用s.getOutputStream()返回一个输出流对象os,用于向服务器端发送信息;
3.调用s.getInputStream()返回一个输入流对象is,用于从服务器端接收信息;
4.通信;
如下例:
TCPServer.java
######################################################################################################################
import java.net.*;
import java.io.*;
public class TCPServer extends Thread
{
Socket s;
TCPServer(Socket s)
{
this.s = s;
}
public static void main(String[] args)
{
try
{
ServerSocket ss = new ServerSocket(6000);
while (true)
{
Socket s = ss.accept();
new TCPServer(s).start(); //每有一个客户请求来就创建一个Socket来与其进行通信。
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
try
{
OutputStream os = this.s.getOutputStream();
InputStream is = this.s.getInputStream();
String str = "Welcome you!";
os.write(str.getBytes());
int iLen = 0;
byte[] buf = new byte[100];
iLen = is.read(buf);
System.out.println(new String(buf, 0, iLen));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
######################################################################################################################
TCPClient.java
######################################################################################################################
import java.net.*;
import java.io.*;
public class TCPClient extends Thread
{
public static void main(String[] args)
{
try
{
//Socket s = new Socket(InetAddress.getByName("localhost"),6000);
//Socket s = new Socket(InetAddress.getByName(null),6000);
Socket s = new Socket(InetAddress.getByName("127.0.0.1"),6000); //用于本机两个进程的通信
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
String str = "Hello, I am zoulida!";
os.write(str.getBytes());
int iLen = 0;
byte[] buf = new byte[100];
iLen = is.read(buf);
System.out.println(new String(buf, 0, iLen));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
######################################################################################################################
(二)UDP编程:
步骤描述:
发送方A:
1.创建一个DatagramSocket类的对象ds,它无需帮定到任何端口和IP地址上,因为通信双方不需要建立连接。
2.创建一个DatagramPacket类的对象dp,它表示要发送的数据包,在包中指定对方的IP地址和端口号。
3.调用ds.send(dp)发送数据。
4.创建一个DatagramPacket类的对象rcvdp,用于表示接收到的数据包。
5.调用ds.receive(rcvdp)从网络上接收数据。
接受方B:
1.创建一个DatagramSocket类的对象ds,并将其帮定到指定的端口上。
2.创建一个DatagramPacket类的对象dp,用于表示接收到的数据包。
3.调用ds.receive(dp)从网络上接收数据。
4.创建一个DatagramPacket类的对象senddp,它表示要发送的数据包,在包中指定对方的IP地址和端口号(这些在dp中已经有了)。
5.调用ds.send(senddp)发送数据。
如下例:
UDPSend.java
###########################################################################################
import java.net.*;
public class UDPSend
{
public static void main(String[] args)
{
try
{
DatagramSocket ds = new DatagramSocket();
String str = "Hi, are you there?";
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(null), 6000);
ds.send(dp);
byte[] buf = new byte[100];
DatagramPacket rcvdp = new DatagramPacket(buf, 100);
ds.receive(rcvdp);
System.out.println(new String(buf, 0, rcvdp.getLength()));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
###############################################################################################################
UDPReceive.java
##########################################################################################################################
import java.net.*;
public class UDPReceive
{
public static void main(String[] args)
{
try
{
DatagramSocket ds = new DatagramSocket(6000);
byte[] buf = new byte[100];
DatagramPacket dp = new DatagramPacket(buf, 100);
ds.receive(dp);
System.out.println(new String(buf, 0, dp.getLength()));
String str = "yes, I am here, how are you!";
DatagramPacket senddp = new DatagramPacket(str.getBytes(), str.length(), dp.getAddress(), dp.getPort()); // 接收到的包中已经有了发送方的信息。
ds.send(senddp);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
##########################################################################################################################
TCP与UDP的区别:
TCP要求双方建立连接,所以在建立流套接字的时候就要明确指定对方的IP地址和端口号,而建立的连接之后双方的通信就很简单了,在发送的时候
将数据扔掉流上,在接收的时候从流上取就可以了。
UDP是双方不需要建立连接,所以不需要在创建套接字时指定对方的IP地址和端口号,但在通信的时候就比较麻烦了,需要在数据包中指定
IP地址和端口号。
ServerSocket类:它表示监听Socket,用于TCP协议中双方建立连接。
Socket类:它是用于TCP通信的Socket类。他是TCP通信中真正用于实现双方通信类。
DatagramSocket类:用于UDP双方的通信套接字。
(一)TCP编程:
步骤描述:
服务器端:
1.创建一个ServerSocket类的对象ss,帮定到指定的端口上;
2.调用ss.accept()方法来等待客户端的连接请求,当请求到来时返回一个用于通信的套接字,即一个Socket类的对象s;
3.调用s.getOutputStream()返回一个输出流对象os,用于向客户端发送信息;
4.调用s.getInputStream()返回一个输入流对象is,用于从客户端接收信息;
5.通信;
客户端:
1.创建一个Socekt类的对象s用于通信,并将其帮定到指定IP地址和端口上;
2.调用s.getOutputStream()返回一个输出流对象os,用于向服务器端发送信息;
3.调用s.getInputStream()返回一个输入流对象is,用于从服务器端接收信息;
4.通信;
如下例:
TCPServer.java
######################################################################################################################
import java.net.*;
import java.io.*;
public class TCPServer extends Thread
{
Socket s;
TCPServer(Socket s)
{
this.s = s;
}
public static void main(String[] args)
{
try
{
ServerSocket ss = new ServerSocket(6000);
while (true)
{
Socket s = ss.accept();
new TCPServer(s).start(); //每有一个客户请求来就创建一个Socket来与其进行通信。
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
try
{
OutputStream os = this.s.getOutputStream();
InputStream is = this.s.getInputStream();
String str = "Welcome you!";
os.write(str.getBytes());
int iLen = 0;
byte[] buf = new byte[100];
iLen = is.read(buf);
System.out.println(new String(buf, 0, iLen));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
######################################################################################################################
TCPClient.java
######################################################################################################################
import java.net.*;
import java.io.*;
public class TCPClient extends Thread
{
public static void main(String[] args)
{
try
{
//Socket s = new Socket(InetAddress.getByName("localhost"),6000);
//Socket s = new Socket(InetAddress.getByName(null),6000);
Socket s = new Socket(InetAddress.getByName("127.0.0.1"),6000); //用于本机两个进程的通信
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
String str = "Hello, I am zoulida!";
os.write(str.getBytes());
int iLen = 0;
byte[] buf = new byte[100];
iLen = is.read(buf);
System.out.println(new String(buf, 0, iLen));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
######################################################################################################################
(二)UDP编程:
步骤描述:
发送方A:
1.创建一个DatagramSocket类的对象ds,它无需帮定到任何端口和IP地址上,因为通信双方不需要建立连接。
2.创建一个DatagramPacket类的对象dp,它表示要发送的数据包,在包中指定对方的IP地址和端口号。
3.调用ds.send(dp)发送数据。
4.创建一个DatagramPacket类的对象rcvdp,用于表示接收到的数据包。
5.调用ds.receive(rcvdp)从网络上接收数据。
接受方B:
1.创建一个DatagramSocket类的对象ds,并将其帮定到指定的端口上。
2.创建一个DatagramPacket类的对象dp,用于表示接收到的数据包。
3.调用ds.receive(dp)从网络上接收数据。
4.创建一个DatagramPacket类的对象senddp,它表示要发送的数据包,在包中指定对方的IP地址和端口号(这些在dp中已经有了)。
5.调用ds.send(senddp)发送数据。
如下例:
UDPSend.java
###########################################################################################
import java.net.*;
public class UDPSend
{
public static void main(String[] args)
{
try
{
DatagramSocket ds = new DatagramSocket();
String str = "Hi, are you there?";
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(null), 6000);
ds.send(dp);
byte[] buf = new byte[100];
DatagramPacket rcvdp = new DatagramPacket(buf, 100);
ds.receive(rcvdp);
System.out.println(new String(buf, 0, rcvdp.getLength()));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
###############################################################################################################
UDPReceive.java
##########################################################################################################################
import java.net.*;
public class UDPReceive
{
public static void main(String[] args)
{
try
{
DatagramSocket ds = new DatagramSocket(6000);
byte[] buf = new byte[100];
DatagramPacket dp = new DatagramPacket(buf, 100);
ds.receive(dp);
System.out.println(new String(buf, 0, dp.getLength()));
String str = "yes, I am here, how are you!";
DatagramPacket senddp = new DatagramPacket(str.getBytes(), str.length(), dp.getAddress(), dp.getPort()); // 接收到的包中已经有了发送方的信息。
ds.send(senddp);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
##########################################################################################################################
TCP与UDP的区别:
TCP要求双方建立连接,所以在建立流套接字的时候就要明确指定对方的IP地址和端口号,而建立的连接之后双方的通信就很简单了,在发送的时候
将数据扔掉流上,在接收的时候从流上取就可以了。
UDP是双方不需要建立连接,所以不需要在创建套接字时指定对方的IP地址和端口号,但在通信的时候就比较麻烦了,需要在数据包中指定
IP地址和端口号。