内容
Ⅰ简单介绍
ⅡSocket详解
具体内容
Ⅰ简单介绍
1.网络编程的定义
网络编程是指在两台不同的计算机之间传递数据,在两台不同的计算机之间传递数据
2.客户端:手机app 浏览器 桌面QQ
服务器端:存储/处理数据
3.ip地址:唯一标识某一台电脑
端口号:唯一标识电脑上的某一个进程(程序)
4.网络中的数据传输:Socket实现->套接字
Socket类:客户端
ServerSocket:服务器端
ⅡSocket详解
1.创建Socket
// 指明和谁通信:ip地址 端口号
Socket socket = new Socket("10.129.7.161", 8989);
2.Socket发送数据
要通过Socket发送数据,我们需要获取Socket的输出流
BufferedReader br = new BufferedReader(newInputStreamReader(socket.getInputStream()));
//向服务器端发送数据
//socket.getOutputStream();
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//客户向服务器端发送数据
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("你好啊");
注意调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送
3.Socket读取数据
要通过Socket读取数据,需要获取Socket的输入流
InputStream in = socket.getInputStream();
int data = in.read();
in.close();
socket.close();
需要注意的是,从Socket的输入流中读取数据并不能读取文件那样,一直调用read()方法直到返回-1为止,因为对Socket而言,只有当服务端关闭连接时,Socket的输入流才会返回-1,而是事实上服务器并不会不停地关闭连接
4.Socket关闭
使用完Socket之后需要把它关闭,断开与服务器的连接
只需要使用close方法即可
socket.close();
5.具体应用时创建客户端Client和服务器端Server两个类
模拟客户端
class Client {
public static void main(String[] args) throws IOException {
//1.创建用于通信的socket
// 指明和谁通信:ip地址 端口号
Socket socket = new Socket("10.129.7.161", 8989);
//接收服务器端的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向服务器端发送数据
//socket.getOutputStream();
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//客户向服务器端发送数据
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("你好啊");
}
}
模拟服务器端
class Server {
public static void main(String[] args) throws IOException {
//1.创建服务器端的serversocket
ServerSocket ss = new ServerSocket(8989);
//2.获取连接的客户端的socket
Socket clientSocket = ss.accept();
//3.向客户端发送数据
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println("登陆成功");
clientSocket.shutdownOutput();
//4.接收客户端发来的数据
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
6.创建一个子线程客户端处理服务器端的数据
实现Runnable接口
class ClientThread implements Runnable {
//保存socket对象
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
try {
//获取服务器端的输入流对象
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取数据
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("网络出错 请重新登录");
System.exit(-1);
} finally {
try {
if (br != null) {
br.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
}
}
}
}