Socket编程

来源:互联网 发布:照片制作mv软件 编辑:程序博客网 时间:2024/05/29 15:46

Socket编程

Java的TCP编程

1.对TCP/IP协议的理解

TCP/IP(TransmissionControl  Protocol/Internet Protocol的简写)中文译作传输控制协议/因特网互联协议,又叫网络通信协议。这个协议书Internet最基本的协议,也是Internet的基础。简单的说,它是由网络层的IP协议和传输层的TCP协议组成。确切的说,TCP/IP协议是一组包括TCP协议和IP协议,UDP协议,ICMP协议和其他的一些协议工程的。

2.TCP协议通信的特点

TCP协议是一种面向连接的,可靠的,基于字节流的运输层(Transport Layer)通信协议。在TCP/IP协议组中,TCP层位于IP层之上,应用层之下。不同的主机的应用层之间经常需要可靠的,像管道一样的连接,IP层不提供这样的流机制,而是提供不可靠的包交换。TCP层的协议就可以提供专业的一种可靠的连接。应用层向TCP层发送8位字节表示的流数据,然后TCP把数据流分割层适当长度的报文段,之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端的TCP层。TCP为了保证不发生丢包,采用一种确认机制,一旦发送失败将提供重发的机会,保证了数据的可靠传输。

3.TCP一般用于C/S模式的应用程序,存在服务器端和客户端两个部分。

对于服务器端:

import java.io.*;

import java.net.*;

 

public class Server {

public staticvoid main(String args[]) throws IOException {

 创建一个服务器端Socket,并指定一个端口号

      ServerSocket server = new ServerSocket(5678);

   开始监听来自客户端的请求要求

      Socket client = server.accept();

   创建Socket连接成功后的输入流和输出流

BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));

            PrintWriterout = new PrintWriter(client.getOutputStream());

            System.out.println("-------Talking-------");

            while(true) {

   得到输入端输入的字符串

                Stringstr = in.readLine();

   打印到控制台上

                System.out.println("Client:" + str);

   将数据写到输出流上,返回到Client

                out.println(str);

   情况缓存

                out.flush();

                if(str.equals("end"))

                    break;

            }

            in.close();

            out.close();

            server.close();

}

}

对于客户端:

import java.io.*;

import java.net.*;

public class Client {

 

    public staticvoid main(String args[]) throws IOException {

        创建Socket,建立与服务器端的连接

        Socket socket= new Socket(InetAddress.getLocalHost(), 5678);

        由Socket获得输入流,并构造字符流对象

        BufferedReaderin = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        由Socket获得输出流,并构造PrintWriter对象

        PrintWriterout = new PrintWriter(socket.getOutputStream());

        创建一个输入流,构造一个字符输入流对象

        BufferedReaderwt = new BufferedReader(new InputStreamReader(System.in));

       

        System.out.println("-------Talking--------");

       

        while (true){

        由控制台输入一行字符,并得到

            Stringstr = wt.readLine();

        写入到Socket的输出流中

            out.println(str);

            清空缓存

out.flush();

            if(str.equals("end"))

                break;

            //System.out.println(in.readLine());

        }

        out.close();

        wt.close();

        socket.close();

    }

}

Java的UDP编程

1.如何理解UDP协议

UDP协议与TCP协议同处于TCP/IP协议的传输层,他们都是用于数据传输的,只不过它没有提供像TCP那样高的可靠机制。它是一个无连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就去简单地抓取来自应用程序的数据,并尽快的把他们扔到网上,不需要维护连接状态,字节开销小。

Java的UDP编程模型

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class Chat{

    public staticvoid main(String args[]) throws Exception{

        //args format:接受端口,发送端口,对方接收端口

        newReceiveThread(Integer.parseInt(args[0])).start();

        new SendThread(Integer.parseInt(args[1]),Integer.parseInt(args[2])).start();

    }

}

class ReceiveThread extends Thread {

    privateDatagramSocket ds;

    publicReceiveThread(int port){

        super();

        try{

            this.ds = new DatagramSocket(port);

        }catch(SocketExceptione){

            e.printStackTrace();

        }

    }

    public voidrun(){

        try{

            byte buff[] = new byte[1024];

            DatagramPacket dp = new DatagramPacket(buff,1024);

            while(true){

                ds.receive(dp);

                String str = newString(dp.getData(),0,dp.getLength());

               

                System.out.println("receive:"+str);

            }

        }catch(Exceptione){

            e.printStackTrace();

        }finally{

            ds.close();

        }

    }

}

class SendThread extends Thread {

    privateDatagramSocket ds;

    private intsendPort;

   

    public SendThread(int port,int sendPort){

        super();

        this.sendPort= sendPort;

        try{

            this.ds = new DatagramSocket(port);

        }catch(SocketExceptione){

            e.printStackTrace();

        }

    }

    public voidrun(){

        try{

            BufferedReader br = new BufferedReader(newInputStreamReader(System.in));

            Stringstr = null;

            while((str= br.readLine())!=null){

                DatagramPacket dp = newDatagramPacket(str.getBytes(),0,str.length(),InetAddress.getLocalHost(),sendPort);

                ds.send(dp);

                System.out.println("send:"+str);

            }

        }catch(Exceptione){

            e.printStackTrace();

        }finally{

            ds.close();

        }

    }

}

原创粉丝点击