Socket编程——java实现

来源:互联网 发布:vb数据库源代码 编辑:程序博客网 时间:2024/06/05 15:49

TCP Socket

客户端

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.SocketTimeoutException;import java.util.Scanner;public class Socket_Client {        public static void main(String[] args) throws IOException {            //客户端请求与本机在2017端口建立TCP连接            Socket client = new Socket("127.0.0.1", 2017);            client.setSoTimeout(10000);            //获取键盘输入            Scanner get_user_input = new Scanner(System.in);            //获取Socket的输出流,用来发送数据到服务端            PrintStream send_channel = new PrintStream(client.getOutputStream());            //获取Socket的输入流,用来接收从服务端发送过来的数据            BufferedReader recieve_channel =  new BufferedReader(new InputStreamReader(client.getInputStream()));            boolean flag = true;            while(flag){                System.out.print("输入信息:");                String str = get_user_input.nextLine();                //发送数据到服务端                send_channel.println(str);                if("bye".equals(str)){                    flag = false;                }else{                    try{                        //从服务器端接收数据有个时间限制(系统自设,也可以自己设置),超过了这个时间,便会抛出该异常                        String echo =recieve_channel.readLine();                        System.out.println(echo);                    }catch(SocketTimeoutException e){                        System.out.println("Time out, No response");                    }                }            }            get_user_input.close();            if(client != null){                //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭                client.close(); //只关闭socket,其关联的输入输出流也会被关闭            }        }}

服务端

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.ServerSocket;public class Socket_Server  implements Runnable {    private Socket con=null;    public Socket_Server(Socket con) {        this.con = con;    }    @Override    public void run(){        try{            //获取socket的输出流,向客户端发送数据            PrintStream send_channel = new PrintStream(con.getOutputStream());            //获取socket的输入流,获取客户端发送过来的数据            BufferedReader recieve_channel = new BufferedReader(new InputStreamReader(con.getInputStream()));            boolean flag=true;            while (flag){                String client_message = recieve_channel.readLine();                if(client_message==null || "".equals(client_message)){                    flag = false;                }                else {                    System.out.print("client info"+client_message);                    if("bye".equals(client_message)){                        flag=false;                    }                    else {                        send_channel.print("Server echo:"+client_message);                    }                }            }            send_channel.close();            con.close();        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) throws Exception {        //创建一个服务端,绑定端口号,监听来自客户端的连接        ServerSocket server = new ServerSocket(2017);        Socket connect = null;        boolean flag = true;        while (flag) {            //接收来自客户端的连接            connect  = server.accept();            System.out.print("与客户端连接成功");            //为新建立的连接,创建一个单独的线程            new Thread(new Socket_Server( connect )).start();        }        server.close();    }}

UDP Socket

UDP 简称 User Datagram Protocol (用户数据报协议),是一种无连接、不可靠的协议,每个数据报都是一个独立的信息,每个被传输的数据报很小(限定在 64k 以下),位于传输层 ( ip 位于网络层 ) 。而且 UDP 协议是不分客户端和服务端,只分发送端和接收端。因为 UDP 协议是面向无连接的,所以速度很快,但会出现数据包丢失。一般用于视频聊天、网络游戏等实时性较高的情况。

发送者

public class UdpSender {    public static void main(String[] args) throws IOException {        //首先创建一个DatagramSocket对象        DatagramSocket socket = new DatagramSocket();        //创建一个InetAddree        InetAddress serverAddress = InetAddress.getByName("127.0.0.1");        //这是要传输的数据        String str = "Hello World!";          //把传输内容分解成字节        byte data[] = str.getBytes();          //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号        DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 4567);        //调用socket对象的send方法,发送数据        socket.send(packet);    }}

接收者

public class UdpReceiver {    public static void main(String[] args) throws IOException {        //创建一个DatagramSocket对象,并指定监听的端口号        DatagramSocket socket = new DatagramSocket(4567);        while (true) {            //如果发送过来的数据大于1024字节,那么将接收不完整            byte data[] = new byte[1024];            //创建一个空的DatagramPacket对象            DatagramPacket packet = new DatagramPacket(data, data.length);            //使用receive方法接收客户端所发送的数据,            //如果客户端没有发送数据,该进程就停滞在这里            socket.receive(packet);            String result = new String(packet.getData(), packet.getOffset(), packet.getLength());            System.out.println(packet.getAddress().getHostName() + " result: " + result);        }    }}
1 0
原创粉丝点击