首页 > 代码库 > Java:进阶学习(1)——网络编程

Java:进阶学习(1)——网络编程

Java:进阶学习(1)——网络编程

基础

Socket与ServerSocket

  Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

Socket方法

getInetAddress();      远程服务端的IP地址
getPort();          远程服务端的端口
getLocalAddress()      本地客户端的IP地址
getLocalPort()        本地客户端的端口
getInputStream();     获得输入流
getOutStream();      获得输出流
 
Socket状态
isClosed();            //连接是否已关闭,若关闭,返回true;否则返回false
isConnect();      //如果曾经连接过,返回true;否则返回false
isBound();            //如果Socket已经与本地一个端口绑定,返回true;否则返回false

  ServerSocket,此类实现服务器套接字。服务器套接字等待通过网络传入的请求然后基于该请求执行某些操作,可能向请求者返回结果。

说明:两者本质均是Socket见的通信,一方为客户,另一方为服务器。客户连接服务器,服务器接受客户并生成一个与其交流的Socket,然后客户发送请求,服务器做出响应。

Socket与ServerSocket的交互

    技术分享

连接超时问题及策略

  1.从套接字读取信息时,在有数据可供访问之前,读操作会被阻塞。

   解决:对于不同的应用应该设置合理的超时值。

socket.setSoTimeout(10000);

说明:设置超时值后,如果没有在规定时间内接受到数据,就会抛出SocketTimeOutException异常。你可以捕获这个异常并做出反应。  

  2.客户端在连接到服务器之前会一直堵塞

   解决:可以先构造一个无连接的套接字,然后再使用一个超时来进行连接的方法解决这个问题。

            Socket socket = new Socket("127.0.0.1",12345);
            用下面方法代替上面方法
            Socket socket1 = new Socket();
            socket1.connect(new InetSocketAddress("127.0.0.1",12345),timeout);

实例

客户端代码

package basic_socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketTest {
    public static void main(String[] args)
    {
        try {
            Socket socket = new Socket("127.0.0.1",12345);
            InputStream inputStream = socket.getInputStream();
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNextLine())
            {
                System.out.println(scanner.nextLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

服务器代码

package basic_socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
    public static void main(String ars[])
    {
        try {
            ServerSocket serverSocket = new ServerSocket(12345);
            while (true)
            {
                Socket socket =serverSocket.accept();
                Thread client = new Client(socket);
                client.start();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Client extends Thread
{
    private Socket socket =null;
    public Client(Socket socket)
    {
        this.socket =socket;
    }
    public void run() {
        try{
            System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort());
            Thread.sleep(10000);
        }catch(Exception e){e.printStackTrace();}finally{
            try{
                System.out.println("关闭连接:"+socket.getInetAddress()+":"+socket.getPort());
                if(socket!=null)socket.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

 

Java:进阶学习(1)——网络编程