一 什么是socket
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,另一种好理解的说法是网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。
二 四种类型socket
基于TCP:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。发送方和接收方的成对的两个socket之间必须建立连接,一旦建立连接,双方并可以互相发送和接收,根据协议可以传输大数据。
基于UDP:UDP是全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。是不可靠的通信协议。
基于rawip:rawip也是原始ip,是通过一个套接字(socket)直接操作IP报头的环境,是非连接,不可靠的数据传输。
基于链路层:为IS-IS协议提供的Socket接口,是非连接,不可靠通信服务。
在java基本上根据TCP/IP来socket编程。
三 原理
既然是通信就需要有两端,一个客户端Client,一个服务器端Server。首先Server先打开socket,并且监听某个端口直到有Clinet连接上,之后从Client中获取信息,也可以给Client发送信息,在结束通信后,关闭socket。
在Client端中向Server发送连接请求,当连接上Server后,可以向Server发送信息,也可以接收来自Server的信息。
以下为Server端代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
int port=1111;
//用serversocket监听1111端口
ServerSocket server = new ServerSocket(port);
//接收socket请求
Socket socket =server.accept();
System.out.println("连接成功");
//输入流
InputStream inputStream= socket.getInputStream();
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[64];
int len;
StringBuilder sb = new StringBuilder();
//读取数据
while ((len=reader.read(chars)) != -1) {
sb.append(new String(chars, 0, len));
}
System.out.println("from client: " + sb);
//关闭输入流
if (inputStream != null) {
inputStream.close();
}
//关闭socket
if (socket != null) {
socket.close();
}
}
}
Client端代码:
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//要连接的服务器端IP地址和端口号
Socket socket=new Socket("127.0.0.1", 1111);
//输出流
Writer out = new OutputStreamWriter(socket.getOutputStream());
//要发给服务器的信息
out.write("Hello,my name is client.");
//写完后要记得flush
out.flush();
//关闭输出流
if (out != null) {
out.close();
}
//关闭socket
if (socket != null) {
socket.close();
}
}
}
以上为socket编程最简单的实现,接下来有空再更新Client、Server同时读写等的情况。