您的位置:首页 > 理论基础 > 计算机网络

使用JAVA实现Socket通信,TCP、UDP简析。

2015-12-30 16:39 866 查看
Socket通信是一种非常重要的通信方式,它使用起来简单方便,也很容易学会,下面就我所知道的简单记录一下。

首先是UDP的方式。(通过Android与PC端进行通信)

发送端:

[java] view
plaincopy

package com.zww.socket;  

import java.net.DatagramPacket;    

import java.net.DatagramSocket;    

import java.net.InetAddress;    

public class SocketClient {    

    public static void main(String[] args) {    

        try {    

            // 创建发送方的套接字,IP默认为本地,端口号随机    

            DatagramSocket sendSocket = new DatagramSocket();    

    

            // 确定要发送的消息:    

            String mes = "你好!接收方!";    

    

            // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据    

            byte[] buf = mes.getBytes();    

    

            // 确定发送方的IP地址及端口号,地址为本地机器地址    

            int port = 11511;    

            InetAddress ip = InetAddress.getLocalHost();    

    

            // 创建发送类型的数据报:    

            DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,    

                    port);    

    

            // 通过套接字发送数据:    

            sendSocket.send(sendPacket);    

    

            // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组    

            byte[] getBuf = new byte[1024];    

    

            // 创建接受类型的数据报    

            DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);    

    

            // 通过套接字接受数据    

            sendSocket.receive(getPacket);    

    

            // 解析反馈的消息,并打印    

            String backMes = new String(getBuf, 0, getPacket.getLength());    

            System.out.println("接受方返回的消息:" + backMes);    

    

            // 关闭套接字    

            sendSocket.close();    

        } catch (Exception e) {    

            e.printStackTrace();    

        }    

    

    }    

}   

接收端:

[java] view
plaincopy

/** *  */package com.zww.socket;  

import java.net.DatagramPacket;  

import java.net.DatagramSocket;  

import java.net.InetAddress;  

import java.net.SocketAddress;  

  

/** 

 * @zww Administrator 

 * 

 */  

public class SocketServer {  

public static void main(String[] args){  

DatagramSocket serverSocket = null;  

try {  

//确定接收方IP和端口号  

InetAddress ip = InetAddress.getLocalHost();  

int port = 11511;  

//确定接收方的套接字  

serverSocket = new DatagramSocket(port, ip);  

//创建接收byte[]  

byte[] rebuf = new byte[1024];  

//创建接收类型数据报  

DatagramPacket getPacket = new DatagramPacket(rebuf, rebuf.length);  

//通过套接字接收数据  

serverSocket.receive(getPacket);  

//解析收到的消息  

String getMsg = new String(rebuf,0,getPacket.getLength());  

System.out.println("收到的消息"+getMsg);  

//获取发送方的IP  

InetAddress rmIP = getPacket.getAddress();  

int rmport = getPacket.getPort();  

System.out.println("rmIP:"+rmIP+"rmport:"+rmport);  

  

//获取发送放套接字地址  

SocketAddress rmSocket = getPacket.getSocketAddress();  

//反馈消息  

String res = new String("yes I Have received");  

byte[] resbyte = res.getBytes();  

  

//构建发送数据报  

DatagramPacket sendPacket = new DatagramPacket(resbyte, resbyte.length ,rmSocket);  

//通过套接字发送回复  

serverSocket.send(sendPacket);  

serverSocket.close();  

} catch (Exception e) {  

  

// TODO: handle exception  

e.printStackTrace();  

}  

}  

}  

现在介绍TCP的实现过程。

客户端代码:

[java] view
plaincopy

// 1.根据指定的server地址和端口,建立socket连接。  

Socket socket = new Socket(server, servPort);  

// 2. 根据socket实例获取InputStream, OutputStream进行数据读写。  

InputStream in = socket.getInputStream();  

OutputStream out = socket.getOutputStream();  

out.write(data);  

//3.操作结束,关闭socket.  

socket.close();  

 服务端代码:

[java] view
plaincopy

 //1. 构造ServerSocket实例,指定服务端口。  

ServerSocket servSock = new ServerSocket(servPort);  

  

  

  

  

while(true)  

{  

       // 2.调用accept方法,建立和客户端的连接  

           Socket clntSock = servSock.accept();  

           SocketAddress clientAddress =      

                clntSock.getRemoteSocketAddress();  

           System.out.println("Handling client at " + clientAddress);  

  

  

        // 3. 获取连接的InputStream,OutputStream来进行数据读写  

            InputStream in = clntSock.getInputStream();  

            OutputStream out = clntSock.getOutputStream();  

  

  

            while((recvMsgSize = in.read(receiveBuf)) != -1)  

            {  

                out.write(receiveBuf, 0, recvMsgSize);  

            }     

        // 4.操作结束,关闭socket.  

            clntSock.close();  

}      

注意一些常见错误,创建同一个socket只能创建一次,第二次使用时无需再次创建,此外socket.close()方法是不能立即释放掉资源的,如果再很短的时间内再次创建被关闭的socket是会出现错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: