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

 import java.net.*;
import java.io.*; public class Client
{
public static void main(String[] args) throws IOException
{
System.out.println("Hello World!"); Socket s = new Socket("127.0.0.1",30000); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(br.readLine()); br.close(); s.close(); }
}
 import java.net.*;
import java.io.*; public class Server
{
public static void main(String[] args) throws IOException
{
System.out.println("Hello World!"); ServerSocket serverSocket = new ServerSocket(30000); while(true)
{
Socket s = serverSocket.accept();
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("您好,收到连接请求");
ps.close();
s.close();
}
}
}

运行结果:略了

  setSoTimeout(int timeout)//设置超时时长(超过timeout后会抛出SocketTimeoutException)

  设置超时的另一种方法(Socket所有构造函数并没有提供指定超时的):

    1.创建一个空连接的Socket对象:

    2.调用connect(new InetSocketAddress(host,port), Int timeout);

下面是加入多线程的聊天程序:

  半关闭的Socket:不适合保持持久通信状态的交互式应用

    shutdownInput():关闭该Socket的输入流,,还能通过输出流输出数据

    shutdownOutput():

  使用NIO实现非阻塞通信:阻塞式--当程序执行输出输入操作后,在这些操作返回之前一直阻塞该线程,所以服务其端要为每个客户端提供一个独立线程进行处理,客户端多时,会导致服务器性能下降

              NOI则可以让一个或几个有限线程同时处理所有客户端

     Selector:SelectableChannel的多路复用器

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

Java网络编程三--基于TCP协议的网络编程的更多相关文章

  1. 学习笔记——网络编程3(基于TCP协议的网络编程)

    TCP协议基础 IP协议是Internet上使用的一个关键协议,它的全称是Internet Protocol,即Internet协议,通常简称IP协议.   使用ServerSocket创建TCP服务 ...

  2. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  3. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  4. (4)socket的基础使用(基于TCP协议的并发编程)

    需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...

  5. 基于TCP协议的网络通讯流程

    不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...

  6. 基于TCP协议的网络编程

    TCP通信协议是一种可靠的传输层协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成虚拟网络链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java使用Socke ...

  7. 基于TCP协议的socket编程

    什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

  8. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

  9. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

随机推荐

  1. 条件编译,C语言条件编译详解

    条件编译是指预处理器根据条件编译指令,有条件地选择源程序代码中的一部分代码作为输出,送给编译器进行编译.主要是为了有选择性地执行相应操作,防止宏替换内容(如文件等)的重复包含.常见的条件编译指令如表 ...

  2. kali linux之漏洞扫描

    发现弱点:基于端口服务扫描结果版本信息,搜索已公开的漏洞数据库 使用弱点扫描器实现漏洞管理 弱点扫描类型(扫描结果不能确定是不是准确的,应该综合对待威胁) 主动扫描:有身份验证,无身份验证 被动扫描: ...

  3. 16、OpenCV Python 腐蚀和彭胀

    __author__ = "WSX" import cv2 as cv import numpy as np def erode_demo(image): print(image. ...

  4. Unity---简单单例模式的使用

    单例模式特点 1.一般用在一个脚本访问另一个脚本中的数据. 2.对于使用单例模式的类,系统中只会存在唯一一个实例,减少了内存开销. Unity中继承于MonoBehaviour的单例模式 public ...

  5. K3 Wise 常用表【转载】

    在后台数据库ICClassType表中,字段FID<0的是老单,FID>0的是新单.--事务类型select * from ICClassType            where  FT ...

  6. redis持久化以及集群

    redis提供了两种持久化策略:RDB与AOF RDB RDB的持久化策略: 按照规则定时将内存的数据同步到磁盘 snapshot(按照快照方式完成,当条件符合redis某一种规则,将内存数据写入磁盘 ...

  7. JavaWeb学习笔记(五)—— request

    一.request概述 request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest.在客户端发出每个请求时,服务 ...

  8. 013 Android ActionFloatingButton悬浮按钮组件与Snackbar组件使用

    1.导入ActionFloatingButton组件(点击下载按钮,安装组件) 2,.ImageView图片XML设置 <ImageView android:id="@+id/imag ...

  9. vue 子页面,向父页面 传值...

    子组件 通过 事件 向父组件传值..... 父组件 方法: methods: { appendData: function (list) { console.log(list); for (var i ...

  10. Hibernate Restrictions的运算符

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictio ...