[TOC]
随着深入学习java的分布式和后台,对于java 实现socket有着很深兴趣,要仔细了解一下,这篇文章就是深入理解java socket编程
- 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求;但在高并发环境下,多线程的开销比较大;
- 基于回调的异步IO,如Nginx服务器使用的epoll模型,这种模式通过事件驱动的方式使用异步IO,使服务器持续运转,但人的思维模式是串行的,大量回调函数会把流程分割,对于问题本身的反应不够自然;
- 协程,不需要抢占式调度,可以有效提高线程的任务并发性,而避免多线程的缺点;但原生支持协程的语言还很少。
socket介绍
在前面的socket原理:(赶快点击) 中有详细介绍,这里就不再做解释了
基于java自身包的socket就是使用BIO(阻塞式),NIO非阻塞式编程
“`java
Socket(InetAddress address,int port);//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket(String host,int port);//创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(InetAddress address,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程地址上的指定远程端口
Socket(String host,int port, InetAddress localAddr,int localPort);//创建一个套接字并将其连接到指定远程主机上的指定远程端口
Socket(SocketImpl impl);//使用用户指定的 SocketImpl 创建一个未连接 Socket
ServerSocket(int port);//创建绑定到特定端口的服务器套接字
ServerSocket(int port,int backlog);//利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号
ServerSocket(int port,int backlog, InetAddress bindAddr);//使用指定的端口、侦听 backlog 和要绑定到的本地 IP地址创建服务器
## BIO socket
```java
客户端:
String host="127.0.0.1";
int port=10086;
Socket socket=null;
try {
socket=new Socket(host, port);
OutputStream out=socket.getOutputStream();
InputStream in=socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(in);
DataOutputStream dataOutputStream=new DataOutputStream(out);
while(true){
String s=in1.nextLine();
dataOutputStream.writeUTF(s);
//System.out.println(s+"zai ke huduan");
String reponse=dataInputStream.readUTF();
if(!reponse.equals(""))
System.out.println(reponse);
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
服务器端使用多线程即可 在run中进行
while(true ){
Socket socket=serverSocket.accept();
ThSer server=new ThSer(socket);
Thread tt=new Thread(server);
tt.start();
}
发表回复