Socket编程
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
socket的基本操作
- 1、socket()函数
- 2、bind()函数
- 3、listen()、connect()函数
- 4、accept()函数
- 5、read()、write()函数等
- 6、close()函数
简单的实现一个调用accept()方法的测试例子
创建一个SocketClient.java
package com.webService.client;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客户端【先启动服务端,再启动客户端】
* 服务端对应的是本包下的SocketServer
* @author Administrator
*
*/
public class SocketClient {
public static void main(String[] args) {
try {
//1.创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost",8888);
//2.获取输入流,向服务器端发送消息
OutputStream os = socket.getOutputStream();//字节输出流
//将输出流包装为打印流
PrintWriter pw = new PrintWriter(os);
pw.write("用户名:admin;密码:admin");
pw.flush();
//关闭输入流
socket.shutdownOutput();
//获取服务器端的输入流,并将读取服务端的响应信息
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info = "";
while((info = br.readLine()) != null){// br.readLine() != null
System.out.println("我是客户端,服务端说:" + info);
}
//关闭资源
br.close();
in.close();
pw.close();
os.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建一个SocketServer.java
package com.webService.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务端
* @author Administrator
*
*/
public class SocketServer {
public static void main(String[] args) {
try {
//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.调用accpet()方法开始监听,等待客户端的链接
System.out.println("*****服务器即将开启,等待客户端链接*****");
Socket socket = serverSocket.accept();
//3.获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();
//将字节流转换成字符流
InputStreamReader isr = new InputStreamReader(is);
//为输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
//循环读取客户端信息
String info = "";
while((info = br.readLine()) != null){// br.readLine() != null
System.out.println("我是服务器,客户端说:" + info);
}
socket.shutdownInput();//关闭输入流
//4.获取输出流。响应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();//调用flush()方法,将缓存输出
//5.关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:SocketServer.java是服务端的
SocketClient.java 是客户端的
先启动服务端的程序,在启动客户端。不然后报错
显示结果:
SocketClient.java 是客户端的
先启动服务端的程序,在启动客户端。不然后报错
服务端显示的是:
*****服务器即将开启,等待客户端链接*****
我是服务器,客户端说:用户名:admin;密码:admin
客户端显示的是:
我是服务器,客户端说:用户名:admin;密码:admin
客户端显示的是:
我是客户端,服务端说:欢迎您!