Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍。首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特定的数据时,服务端和客户端都关闭,一个服务端对应一个客户端,不涉及多线程等内容,一切都是最简单最基础的知识点。

下面给出的代码,可以直接拷贝到eclipse中运行, 无需任何更改。

关于socket和seversocket的原理以及构造函数等一些简单的介绍,可以查看其他的一些博客,期中写的比较清晰,我给大家推荐一个[Java]Socket和ServerSocket学习笔记 。期中关于socket的通信原理和需要基本了解的一些构造函数,常用函数等,都进行了简单的介绍。

开发环境为eclipse,新建两个普通的Java工程,一个命名为server_1,作为服务端,另一个命名为client_1,作为客户端,完成的功能就是在客户端的控制台输入内容后,客户端将内容发送至服务端,在服务端的控制台可以看到输入的内容,当输入的内容为shutdown时,服务端和客户端都关闭通信,通信结束。

服务端代码:

package server_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class server_1 {  
    public static void main(String[] args) throws IOException { //将异常全部抛出 
        ServerSocket server = new ServerSocket(10000);    //用serversocket来启动服务器,并指定端口号
        System.out.println("服务器启动。。。");
    
            Socket socket = server.accept();  //获取客户端的socket信息
            BufferedReader in = null;  
            in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //启动缓冲区 
            while (true) {  
                  String msg = in.readLine(); // 将客户端发送来的信息存储在msg中 
                  System.out.println(msg);   
                  if (msg.equals("shutdown")) {  //客户端如果发送的是shutdown,就关闭客户端
                        break;  
                  }  
             }
             in.close(); //执行相应的关闭操作                 
    }  
}

考虑这是一个入门级的程序,所以暂时不考虑各种异常情况,咋mian函数的后面就讲各种异常抛出。

建立seversocket,并且指定服务器的端口号为10000,此时服务器端开始运行。(端口号尽量取大于1024的数字,小于1024的一般都是系统程序占用)

然后利用socket实现和客户端的连接。

in是一个输入缓冲区,客户端发送来的信息就暂时存储在这个缓冲区中。

然后用while语句,循环的监听客户端发送过来的数据,当是一般信息时,就讲客户端发来的内同打印到控制台,如果是“shutdown”,则关闭服务器端,此次通信终止。


客户端程序:

package client_1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class client_1 {  
    public static void main(String[] args) throws Exception {  
    	System.out.println("客户端启动");
        Socket socket = new Socket("localhost", 10000);  //启动socket,并连接本地主机的相应端口号
        PrintWriter out = new PrintWriter(socket.getOutputStream());  
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//从控制台获取输入的内容  
        //不断的获取输入的内容,并不断的发送给服务器,当输入shutdown时,跳出循环,停止运行
        while (true) {  
            String msg = reader.readLine();  
            out.println(msg);  
            out.flush();  
            if (msg.equals("shutdown")) {  
                break;  
            }  
        }  
        //执行相应的关闭操作
        socket.close();
        out.close();
        reader.close();
    }  
}



同样也是在main函数后就抛出所有的异常,不考虑一些比较复杂的异常情况。

建立socket来准备进行通信,指定服务端的位置为“localhost”(也就是本机,也可以使用IP:127.0.0.1),端口号要和服务器端的端口号对应,为10000。
建立reader为缓冲区,将控制台输入的内容先存储到缓冲区中。

建立out用来发送数据。

通过while循环监听控制台,通过socket将缓冲区的内容发送到服务端,如果输入的是一般结果,则将内容发送给服务端,如果输入的时“shutdown”,则将内容发送后跳出循环, 此次通信结束。


以上就是关于socket通信的一个非常简答的例子。


2015年11月19日   西安交通大学