网络编程之Soctet基础
积少成多,全靠自觉
注:我也是一个小白,在IT的路上我们一起向前进步。
说明:最近毕业设计需要做一个聊天软件,很需要复习下java网络编程中的Socket知识,由此,写下学习记录,方便自己,方便他人。
Socket类
- Socket是Java网络应用程序的一个基本的构造模块,它实现了程序之间的双向通信。
Socket是一个通信端点,当一个Socket连接建立以后,用户就可以从该Socket类的对象中获取输入输出流。
Socket类的构造方法有下面几种形式:
- 1.Sicket(InetAddress address, int port)
- 2.Sicket(InetAddress address, int port,InetAddress localAddr,int localPort)
- 3.Sicket(String host, int port)
- 4.Sicket(String host,InetAddress localAddr, int localPort)
- 参数说明:
- address:主机地址
- Host:主机地址
- localAddress:本机地址
- localPort:本地端口
- port:主机监听端口
Socket类中的一些常用方法
- void close() //关闭Socket
- InetAddress getInetAddress() //获取当前连接的Internet地址
- InputStream getInputStream() //获取该Socket的输入流
- InetAddress getLocalAddress() //获取本地地址
- int getLocalPort() //获取本地端口号
- OutputStream getOutputStream() //获取该Socket的输出流
- int getPort() //获取远地端口号
- int getSoLinger() //获取连接关闭后的发送数据延迟时间
- int getSoTimeout() //获取读数据时的最长等待时间
- void setSoLinger(Boolean on, int linger) //设置连接关闭后的发送数据延迟时间
- void setSoTimeout(int timeout) //设置读数据时的最长等待时间
- void shutdownInput() //关闭输入流
- void shutdownOutput() //关闭输出流
上边Socket的常用方法(用到的时候再查询就好)
- 所谓socket通常也称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求
- ServerSocket和Socket类位于java.net包中
- ServerSocket:用户服务器端
- Socket:建立网络连接时使用
在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
服务器
- 使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
- 客户端
- 使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
说了这么多理论,不如敲一遍代码测试一下
- Client代码:
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
// 向本机的5525端口发出客户请求 (InetAddress.getLocalHost:获取本地主机名)
//创建一个流套接字,并将其与指定的IP地址中的指定端口号连接起来。
Socket socket = new Socket(InetAddress.getLocalHost(), 5525);
// 由Socket对象得到输入流,并构造相应的BufferReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
// 由系统标准输入设备构造BufferedReader对象
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = sin.readLine();// 从系统标准输入读入一字符串
os.println(str);
os.flush(); // 刷新输出流,使Server马上收到该字符串
String s = is.readLine();
System.out.println("Server : " + s);// 在标准输出上打印从Server读入的字符串
if (str.equals("end")) {
break;
}
}
is.close();// 关闭Socket输入流
os.close();// 关闭Socket输出流
socket.close();// 关闭Socket
}
}
- Server代码:
public class MyServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(5525);// 创建一个ServerSocket在端口5525监听客户请求
Socket client = server.accept();// 使用accept()阻塞等待客户请求
BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream()));//获取客户端发送的流
PrintWriter os = new PrintWriter(client.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = is.readLine();
System.out.println("Client : " + str);// 在标准输出上打印从Client读入的字符串
os.println(sin.readLine());
os.flush();// 刷新输出流,使Client马上收到该字符串
if (str.equals("end")) {
break;
}
}
is.close();
os.close();
client.close();
server.close();
}
}
test步骤:
- 1.run Server
- 2.run Client
- 3.如果run后都没有报错,那说明客户端和服务器连接成功
- 4.开始会话
Client/Server会话示例:
- Client
- Server: