Java socket编程--TCP UDP

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这篇博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值