Java是一门很强大的语言,在Java中网络编程是通过socket(套接字)编程实现的。我们主流电脑上支持的通信协议TCP/IP通过Java实现起来特别简单。当然Java也支持其他通信协议。例如,UDP(用户数据报通信协议)。在这里就不仔细介绍两者通信协议的具体协议内容。
1、基于TCP的socket编程。
• java.net.ServerSocket是用来创建服务器端的套接字socket。
• java.net.Socket是用来创建客户端的套接字socket。
• InetAddress(java.net.InetAddress)类:用来表示IP地址。
这是一个典型的c/s结构的TCP编程框架。
服务器端我们声明一个服务器套接字类的变量,然后socket.accept()等客户端连接。连接后成功后socket.accept()返回一个socket类对象,这时我可以通过声明一个socket类承接他,再用多线程的方法去执行对应的代码,释放服务器套接字让其继续监听连接,从而实现一个服务器为多个客户端服务。
客户端我们声明一个socket类连接对应IP地址上的服务器,获得连接后就可以进行通讯了!
两者通过发送数据帧通信,Java通过输入输出流这些类来获得我申明的套接字获取的数据流信息。
服务器端代码如下:
public class TcpServer implements Runnable{
private Socket socket;
public TcpServer(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(socket.getOutputStream());
while(true){
//System.out.print("a");
String str=br.readLine();
System.out.println(str);
out.println("已经收到");
//System.out.print("b");
out.flush();
//System.out.print("c");
if(str.equals("bye"))break;
}
//System.out.print("d");
if(socket==null)socket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
public static void main(String args[]) throws IOException {
ServerSocket server=new ServerSocket(4999);
while(true)
{
Socket sk=server.accept();
TcpServer tcp=new TcpServer(sk);
tcp.run();
}
}
}
客户端代码如下:
public class TcpClient {
static Socket server;
public static void main(String[] args) throws Exception {
//InetAddress ip=InetAddress.getByName("xzd1-pc");
server = new Socket(InetAddress.getLocalHost(), 4999);
BufferedReader in = new BufferedReader(new InputStreamReader(
server.getInputStream()));
PrintWriter out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
System.out.println(in.readLine());
if (str.equals("end")) {
break;
}
}
server.close();
}
}
UDP通信协议是一无连接的通讯协议,即我发出的数据发出去了对方可能收不到。
2、基于UDP的socket编程。
创建流程如下:
• java.net.DatagramSocket(数据电报套接字)。
• java.net.DatagramPacket(数据电报包,里面包含了发送的信息)。
这里发送和接受双方都是使用数据报套接字类,通过这类下的send()和receive()方法进行数据收发。这里的两者的通讯载体是数据报。以太网(Ethernet)数据帧的长度必须在46-1500字节之间,而“包”是包含在“帧”里的,所以包的是低于1500个字节。在局域网内建议一个udp包控制在1472字节以下为好.如果一旦超过这个数,数据包就会拆分数据,接收方就需要重组数据。而且一旦网络不好的话,由于UDP不是保障性传输,丢失一片数据就会导致这个数据包无法使用。
发送方代码:
public class Udpsever extends Thread {
String str="明天小雨";
int port=4998;
InetAddress ip=null;
MulticastSocket socket=null;
Udpsever(){
try {
ip=InetAddress.getByName("224.255.10.0");
socket=new MulticastSocket(port);
socket.setTimeToLive(1);
socket.joinGroup(ip);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
DatagramPacket packet=null;
byte data[]=str.getBytes();
System.out.println(new String(data));
packet=new DatagramPacket(data,data.length,ip,port);
try {
socket.send(packet);
try {
sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(socket==null)break;}
socket.close();
}
public static void main(String args[]) throws IOException {
new Udpsever().run();
}
}
接收方代码:
public class UdpClients implements Runnable{
@SuppressWarnings("resource")
@Override
public void run() {
InetAddress group = null;
MulticastSocket socket = null;
try {
group = InetAddress.getByName("224.255.10.0");
socket = new MulticastSocket(4998);
socket.joinGroup(group);
} catch (IOException e1) {
e1.printStackTrace();
}catch (Exception e1) {
e1.printStackTrace();
}
while(true){
byte data[]=new byte[1024];
DatagramPacket packet=null;
try {
packet=new DatagramPacket(data,data.length,group,4998);
socket.receive(packet);
String message=new String(packet.getData(),0,packet.getLength());
System.out.println(message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
new UdpClients().run();
}
}
以上代码为自己原创 相关资料和图片参考了http://www.2cto.com/kf/201210/162813.html这篇博文