java网络-Socket

Posted _oldzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java网络-Socket相关的知识,希望对你有一定的参考价值。

1,Socket的应用

java实现tcp通信主要通过Socket类。当客户端想要打开一个连接到服务器的TCP/IP连接时,就要使用到Socket类。socket类只需要被告知连接的IP地址和TCP端口,其余的都有Java实现。假如我们想要打开一个监听服务,来监听客户端连接某些指定TCP端口的连接,那就需要使用ServerSocket类。当客户端通过Socket连接服务器端的ServerSocket监听时,服务器端会指定这个连接的一个Socket,此时客户端与服务器端间的通信就变成Socket与Socket之间的通信。

利用ServerSocket获取一个Socket时线程会阻塞,除非有一个新的连接进来。下面程序中的handler方法中的read也会阻塞,除非有新的数据写入进来。所以当一个客户端连接进来没有退出时,会阻塞在read上,等待写入。这时候其它客户端没法连进来。所以可以在handler上使用多线程来处理。accept不需要理会它的阻塞,只要有新连接进来就OK。所以可以使用注释中的线程池来解决多客户端连接的问题。

public class Server2 
    @SuppressWarnings("resource")
    public static void main(String[] args) throws Exception 

        //ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        //创建socket服务,监听9000端口
        ServerSocket server=new ServerSocket(9000);
        System.out.println("server start...");
        while(true)
            //获取一个套接字(阻塞)
            final Socket socket = server.accept();
            System.out.println("来个一个新客户端!");
            /*newCachedThreadPool.execute(new Runnable() 
                @Override
                public void run() 
                    //业务处理
                    handler(socket);
                
            );*/
            handler(socket);
        
    

    /**
     * 读取数据
     * @param socket
     * @throws Exception
     */
    public static void handler(Socket socket)
        try 
            byte[] bytes = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            while(true)
                //读取数据(阻塞)
                int read = inputStream.read(bytes);
                if(read != -1)
                    System.out.println(new String(bytes, 0, read));
                else
                    System.out.println("disconnection");
                    break;
                
            
         catch (Exception e) 
            e.printStackTrace();
        finally
            try 
                System.out.println("socket关闭");
                socket.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

2,URL类和URLConnection类

这两个类可以用来创建客户端到web服务器(HTTP服务器)的连接。下面利用这两个类发起了一个get请求

URL url = new URL("http://jenkov.com");
URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();
int data = input.read();
while(data != -1)
System.out.print((char) data);
data = input.read();

input.close();

如果你想发送一个HTTP POST请求,要调用URLConnection.setDoOutput(true)方法,一旦你调用了setDoOutput(true),你就可以打开URLConnection的OutputStream,如下:
OutputStream output = urlConnection.getOutputStream();
你可以使用这个OutputStream向相应的HTTP请求中写任何数据,但你要记得将其转换成URL编码。具体名字是:application/x-www-form-urlencoded MIME 格式编码)使用这种方式发HTTP请求容易导致断码,还是使用HttpClient包好一点。

以上是关于java网络-Socket的主要内容,如果未能解决你的问题,请参考以下文章

java socket网络编程

java socket有啥作用

java网络编程Socket通信详解

Java网络编程——Socket

Java中Socket网络通信

JAVA I/O网络Socket和ServerSocket