java socket 通信

Java Socket通信
通过Java Socket 实现网络通信,java socket 在java.net 包中,实现通信首先有一个服务端和一个客户端。
开始之前我们先了解一下端口号,TCP /IP的基本知识。
端口号的知识:端口号用来区分计算机不同的服务,范围为TCP/IP协议中的服务端口,端口号的范围从0到65535,0到1023为系统保留的端口号,我们设置端口号的时候要设置1023之后的端口号。
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议.
IP 是互联网协议
Java socket 就是基于TCP/IP网络通信,java socket 通信至少需要一个客户端Socket和一个服务端ServerSocket;

Socket 连接的一般流程图:
这里写图片描述
服务端的输入流就是客户端的输出流,服务的输出流就是客户端的输入流

实现一个客户端和服务端(电脑端)的简单通信功能:

客户端:
Socket客户端的创建过程:
1.创建Socket,指定服务器IP和端口,进行连接
2.创建连接后,获取Socket 的输入流读取服务发送的消息。
3.通过输出向服务发送消息
4.关闭输入输出流,关闭socket。
代码实现:
public class ClientSocket {
private Socket mSocket;
private String Ip=”127.0.0.1”;
private DataInputStream input=null;
private DataOutputStream output=null;
private static Scanner mScanner=null;
public static void main(String[] args) {
// TODO Auto-generated method stub

    ClientSocket client=new ClientSocket();
    client.connectServer();

// new ClientSocket().connectServer();
mScanner=new Scanner(System.in);
client.sentMessage();

}
public void sentMessage(){
    while (true) {
        String msg=mScanner.nextLine();
        try {
            output.writeUTF(msg);
            output.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("IOException:"+e);
            e.printStackTrace();
        }
    }

}
public void connectServer(){
    mSocket=new Socket();
        System.out.println("连接服务器。。。。。。:");
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    mSocket.connect(new InetSocketAddress(Ip, 4560), 40000);
                    output=new DataOutputStream(mSocket.getOutputStream());
                    output.writeUTF("你好我是客户端请求连接!!!");
                    output.flush();
                    input=new DataInputStream(mSocket.getInputStream());
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

// int len=0;
while (true) {
try {
int len=0;
byte[] bt=new byte[1024*4];
while((len=input.read(bt))!=-1){
String str=new String(bt,”UTF-8”);
System.out.println(“服务器说:”+str);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

            }
        }).start();
}
/**
 * 
 * 断开连接
 * home-no110
 * 上午8:55:41
 * void
 */
public void disconnect() {
    try {
        output.close();
        input.close();
        mSocket.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

服务端:
ServeSocket 创建过程
1.创建ServerSocket,并指定ServerSocket端口号
2.通过accept()方法侦听并接受到此套接字的连接
3.收到客户端的连接后,通过输入流读取客户端发送的消息
4.通过输出流向客户端发送消息
5.关闭相应资源,输入输出流,Socket,ServerSocket
代码实现 :
public class ServerDemo {
private static ServerSocket mServerSocket;
private static DataInputStream input=null;
private static DataOutputStream output=null;
private static Scanner mScanner;
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerDemo service=new ServerDemo();
service.startServer();
mScanner=new Scanner(System.in);
service.sendMessage();

}
/**
 * 
 * 
 * home-no110
 * 下午10:11:02
 * void
 */
public  void sendMessage(){
    while(true){
        String msg=mScanner.nextLine();
        if(output!=null){
            try {
                output.writeUTF(msg);
                output.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.println("IOException:"+e);
                e.printStackTrace();
            }
        }
    }
}
public void startServer(){
    new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                mServerSocket=new ServerSocket(4560);
                while (true) {
                    System.out.println("等待客户端器连接");
                    Socket mSocket=mServerSocket.accept();
                    ServerThread mThread=new ServerThread(mSocket);
                    mThread.start();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }).start();


}
private class ServerThread extends Thread{
    private  Socket mSocket;

    public ServerThread(Socket mSocket) {
        super();
        this.mSocket = mSocket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();

        try {
            input=new DataInputStream(mSocket.getInputStream());
            output=new DataOutputStream(mSocket.getOutputStream());
            output.writeUTF("服务器启动");
            output.flush();
            byte [] bt=new byte[1024*4];
            while((true)){
                int len=0;
                while((len=input.read(bt))!=-1){
                    String str=new String(bt, "UTF-8");
                    System.out.println("客户端说:"+str);

                }

            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            input.close();
            output.close();
            mSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

到这里一个简短的socket通信就完成了。

猜你喜欢

转载自blog.csdn.net/songmingzhan/article/details/78763693