ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状体
Socket accept():如果接收到客户端的连接请求,该方法返回一个与客户端对应Socket对象,否则该方法将一直处于等待状态,线程也被阻塞
提供了三个构造器:
ServerSocket(int port):监听port端口(端口号指定大于1024)
ServerSocket(int port , int backblog):????????????backlog有啥用还没查???????????
ServerSocket(int port , int backblog, InetAddress localAddr):将serversocket绑定到指定IP的地址(当机器存在多个IP地址时)
Socket
Socket(InetAddress/String remoteAddress, int port, InetAddress localAddr, int localPort):创建连接到远程主机,端口的连接,并制定本机的IP地址和端口(适用于本机有多个IP地址)
Socket(InetAddress/String remoteAddress, int port):创建连接到远程主机,端口好的Socket,使用本机默认的ip地址,和端口号
InputStream getInputStream():返回输入流,程序可以通过输入流从Socket中读取数据
OutputStream getOutputStream():返回该Socket的输出流,程序通过输出流向Socket中写数据
一个简单的例子:Client + Server
1 import java.net.*; 2 import java.io.*; 3 4 public class Client 5 { 6 public static void main(String[] args) throws IOException 7 { 8 System.out.println("Hello World!"); 9 10 Socket s = new Socket("127.0.0.1",30000); 11 12 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 13 14 System.out.println(br.readLine()); 15 16 br.close(); 17 18 s.close(); 19 20 } 21 }
1 import java.net.*; 2 import java.io.*; 3 4 5 public class Server 6 { 7 public static void main(String[] args) throws IOException 8 { 9 System.out.println("Hello World!"); 10 11 ServerSocket serverSocket = new ServerSocket(30000); 12 13 while(true) 14 { 15 Socket s = serverSocket.accept(); 16 PrintStream ps = new PrintStream(s.getOutputStream()); 17 ps.println("您好,收到连接请求"); 18 ps.close(); 19 s.close(); 20 } 21 } 22 }
运行结果:略了
setSoTimeout(int timeout)//设置超时时长(超过timeout后会抛出SocketTimeoutException)
设置超时的另一种方法(Socket所有构造函数并没有提供指定超时的):
1.创建一个空连接的Socket对象:
2.调用connect(new InetSocketAddress(host,port), Int timeout);
下面是加入多线程的聊天程序:
半关闭的Socket:不适合保持持久通信状态的交互式应用
shutdownInput():关闭该Socket的输入流,,还能通过输出流输出数据
shutdownOutput():
使用NIO实现非阻塞通信:阻塞式--当程序执行输出输入操作后,在这些操作返回之前一直阻塞该线程,所以服务其端要为每个客户端提供一个独立线程进行处理,客户端多时,会导致服务器性能下降
NOI则可以让一个或几个有限线程同时处理所有客户端
Selector:SelectableChannel的多路复用器
非阻塞式的通信,,,,,,没写