JAVA网络编程之Socket

Socket网络编成是一种较为底层的网络数据传输,很多语言都支持。

本例是根据菜鸟教程中的Java网络编程而写。

详细内容参考请参考:http://www.runoob.com/java/java-networking.html

 

Socket 编程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现 socket。

客户端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {

public static void main(String[] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);

try {
        System.out.println("连接到主机:" + serverName + ",端口号:" + port);
        Socket clientSocket = new Socket(serverName, port);
        System.out.println("远程主机地址为:" + clientSocket.getRemoteSocketAddress());
        // 创建客户端输出流,用于向服务器发送数据
        OutputStream outToServer = clientSocket.getOutputStream();
        // 将输出流转换为数据输出流
        DataOutputStream out = new DataOutputStream(outToServer);
        // 采用数据输出流的writeUTF()方法向服务器发送数据
        out.writeUTF("Hello from" + clientSocket.getLocalSocketAddress());

        // 创建客户端输入流,用于向接收来自服务的数据流
        InputStream inFromServer = clientSocket.getInputStream();
        // 将输入流转换为数据输入流
        DataInputStream in = new DataInputStream(inFromServer);
        // 读来自服务器的数据
        System.out.println("服务器响应:" + in.readUTF());

        // 关闭服务器套接字
        clientSocket.close();
    }catch(IOException e) {
        e.printStackTrace();
        
    }
}

服务器端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;


public class Server extends Thread{
    // Server类有一个私有的serverSocket对象引用,用于与客户端链接
    private ServerSocket serverSocket;

    // 构造函数,初始化serverSocket
    public Server(int port) throws IOException{
    // 创建一个ServerSocket对象,绑定到本地port数值表示的端口
    serverSocket = new ServerSocket(port);
    // 设置服务器超时时间为10000毫秒
    serverSocket.setSoTimeout(10000);
    }

    // 主功能模块
    public void run() {
        while(true) {
            try {
                System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
                // 等待客户端连接
                Socket server = serverSocket.accept();

                // 执行到这时,客户端已成功连接,打印客户端socket地址
                System.out.println("远程主机地址:" + server.getRemoteSocketAddress() );

                // 创建数据输入流,接收来自客户端的数据
                DataInputStream in = new DataInputStream(server.getInputStream());
                // 打印接受的数据
                System.out.println(in.readUTF());

                // 创建数据输出流
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                // 通过数据输出流,向客户端的发送数据
                out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGood bye!");

                server.close();
            }catch(SocketTimeoutException ste) {
                System.out.println("Socket timed out!");
                break;
            }catch(IOException ioe) {
                ioe.printStackTrace();
                break;
            }
        }
    }
    // 程序入口 
    public static void main(String[] args) {
        int port = Integer.parseInt(args[0]);

        try {
            Thread t = new Server(port);
            t.run();
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

 

你可能感兴趣的:(JAVA)