`
lamono
  • 浏览: 31576 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java socket编程

阅读更多

java socket编程
http://www.yesky.com/433/1749933.shtml

一个基于UDP数据广播的局域网络会议程序

    Sockets有两种主要的操作方式:面向连接的和无连接的。面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫。所有的事情在到达时的顺序与它们出发时的顺序时一样。无连接的sockets操作就像是一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样。
  到底用哪种模式是邮应用程序的需要决定的。如果可靠性更重要的话,用面向连接的操作会好一些.比如文件服务器需要他们的数据的正确性和有序性.如果一些数据丢失了,系统的有效性将会失去。一些服务器,比如间歇性地发送一些数据块.如果数据丢了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时了.确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系统的回应速率.
    面向连接的操作使用TCP协议.一个这个模式下的socket必须在发送数据之前与目的地的socket取得一个连接.一旦连接建立了,sockets就可以使用一个流接口:打开-读-写-关闭.所有的发送的信息都会在另一端以同样的顺序被接收.面向连接的操作比无连接的操作效率更低,但是数据的安全性更高.

    无连接的操作使用数据报协议.一个数据报是一个独立的单元,它包含了所有的这次投递的信息.把它想象成一个信封吧,它有目的地址和要发送的内容.这个模式下的socket不需要连接一个目的的socket,它只是简单地投出数据报.无连接的操作是快速的和高效的,但是数据安全性不佳.  

1、java数据报类(UDP方式)
  不像面向连接的类,数据报的客户端和服务器端的类在表面上是一样的.下面的程序建立了一个客户和服务器商的数据报sockets:
DatagramSocket serverSocket = new DatagramSocket( 4545 );
DatagramSocket clientSocket = new DatagramSocket();
  服务器用参数4545来指定端口号,由于客户端将要呼叫服务器,客户端可以利用可利用的端口.如果省略第二个参数,程序会让操作系统分配一个可用的端口.客户端可以请求一个指定的端口,但是如果其它的应用程序已经绑定到这个端口之上,请求将会失败.如果你的意图不是作为一个服务器,最好不要指定端口.

下面是自己写的测试代码:

server端代码:

public class UDPServer {    
    public static void main(String[] agrs){
        DatagramSocket socket = null;
        DatagramPacket sendPacket,receivePacket;
        try {
            socket = new DatagramSocket(4455);
            while(socket != null){
                receivePacket = new DatagramPacket(new byte[548],548);
                socket.receive(receivePacket);
                //对获取的数据简单处理
                String data = new String(receivePacket.getData());
                System.out.println("receive data:"+data);

                String Donedata = "done:"+data;
                byte[] byteDate =  Donedata.getBytes();
                sendPacket = new DatagramPacket(byteDate,byteDate.length,receivePacket.getAddress(),receivePacket.getPort());
                socket.send(sendPacket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket != null) socket.close();
        }

    }
}

client端代码:

public class UDPClient {

    public static void main(String[] args) throws Exception {

        long start = System.currentTimeMillis();
        DatagramSocket socket = null;
        DatagramPacket sendPacket,receivePacket;

        try {
            socket = new DatagramSocket();
            socket.setSoTimeout(500);
            String dataOrg = "original data" ;
            byte[] byteDate = dataOrg.getBytes();
            System.out.println(byteDate.length);
            sendPacket = new DatagramPacket(byteDate,byteDate.length,InetAddress.getByName("218.206.*.*"),4455);
            socket.send(sendPacket);            receivePacket = new DatagramPacket(new byte[548],548);
            socket.receive(receivePacket);
            //对获取的数据简单处理
            String dataDone = new String(receivePacket.getData());
            System.out.println(dataDone);

            System.out.println("spend:"+(System.currentTimeMillis() -start));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket != null) socket.close();
        }
    }   
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics