zoukankan      html  css  js  c++  java
  • Java网络编程三--基于TCP协议的网络编程

    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的多路复用器

        非阻塞式的通信,,,,,,没写

  • 相关阅读:
    Linux之C编译器gcc和makefile使用简介
    基于OWin的Web服务器Katana发布版本3
    OAuth和OpenID的区别
    关于 Token,你应该知道的十件事
    HTTP Header 详解
    Entity Framework教程及文章传送门
    CSP(Content Security Policy) 入门教程
    gulp构建工具的几个使用技巧
    浅谈程序员的英语学习
    如何选择正确的angular2学习曲线?
  • 原文地址:https://www.cnblogs.com/xiaochenztx/p/8543446.html
Copyright © 2011-2022 走看看