[toc]
socket基础知识
socket概念
socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务
socket通信过程
socket通信过程如下图所示
java socket编程
java的socket实现其实是通过调用操作系统的socket api实现的,下面图展示其调用关系
示例程序
Server.java
package com.zavier;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(8888);
while(true){
Socket socket=serverSocket.accept();
Thread thread=new Thread(new Listener(socket));
thread.start();
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
Listenr.java
package com.zavier;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
public class Listener implements Runnable{
private Socket socket;
public Listener(Socket socket){
this.socket=socket;
}
@Override
public void run(){
InetAddress address = socket.getInetAddress();
int port=socket.getPort();
try{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data;
while((data = in.readLine()) != null){
System.out.println("["+address+":"+port+"]:"+data);
}
socket.close();
}
catch (Exception e){
System.out.println(e.getMessage());
}
}
}
Client.java
package com.zavier;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
String serverName = "127.0.0.1";
int port = 8888;
try{
Socket socket=new Socket(serverName,port);
//由系统标准输入设备构造BufferedReader对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
String readline;
//从系统标准输入读入一字符串
readline=sin.readLine();
while(!readline.equals("bye")) {
//将从系统标准输入读入的字符串输出到Server
os.println(readline);
//刷新输出流,使Server马上收到该字符串
os.flush();
readline=sin.readLine();
}
os.close();
socket.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
运行截图
参考链接
https://www.cnblogs.com/riacool/archive/2010/12/14/1905404.html https://blog.csdn.net/vipshop_fin_dev/article/details/102966081
来源:oschina
链接:https://my.oschina.net/u/4375708/blog/4177040