1.介绍
Socket也叫套接字编程,是一个抽象层。
应用程序可以通过它发送或接收数据,可对其像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。
网络套接字是IP地址与端口与tcp协议的组合。
Socket就是为网络编程提供的一种机制 / 通信的两端都有Socket。
网络通信其实就是Socket间的通信 / 数据在两个Socket间通过I/O传输。

查看本机ip地址:打开DOS窗口输入-ipconfig
回声案列
2.服务器端
1,启动服务器
2,接收客户端的连接请求
3,给每个客户端分配对应的话务员
4,话务员:主要负责和客户端沟通I/O
package cn.tedu.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//这个类用来做回声案例的服务器端
public class Server2 {
// 创建方法,负责1和2和3
public void service() {
// 在服务器端,使用多线程开发,让每个客户端之间不用等待,可以并发访问,提高服务器的执行效率,提高吞吐量
new Thread() {// 匿名对象+匿名内部类(重写run方法)
// 把业务写入run()中
@Override
public void run() {
try {
// 1,启动服务器,并在8000端口处等待客户端连接
ServerSocket server = new ServerSocket(8000);
System.out.println("服务器启动成功...");
while (true) {
// 2,一直接收所有客户端的连接请求
Socket socket = server.accept();
System.out.println("客户端连接成功...");
// 3,给每个客户端分配对应的话务员,1V1
HuaWuThread t = new HuaWuThread(socket);
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();// 启动线程
}
// 4,话务员:主要负责和客户端沟通I/O
class HuaWuThread extends Thread {
Socket socket;// 保持通话
public HuaWuThread(Socket socket) {
this.socket = socket;
}
// 把业务放入run(),一直读取客户端发来的数据,并作出回声数据
@Override
public void run() {
try {
//读取一行BufferedReader,并且写出一行PrintWriter
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())) ;
//读取客户端发来 的一行数据
String line;//定义变量,记录读取到的一行的数据
while( ( line = in.readLine() ) != null) {//只要有数据就一直读
System.out.println("客户端发来的数据是:"+line);
System.out.println("请输入您想要给客户端回声的数据:");
String input = new Scanner(System.in).nextLine();
out.println(input);//给客户端做的回声数据
out.flush();//把数据刷出去
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server2 s = new Server2();
s.service();
}
}
3.客户端
1,连接指定的服务器
2,一直给服务器发送数据
3,一直接收服务器回声的数据
package cn.tedu.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
//这个类用来做回声案例的客户端
public class Client2 {
public static void main(String[] args) {
try {
// 1,连接指定的服务器,同时指定服务器的ip和端口号
Socket socket = new Socket("127.0.0.1",8000);
// 2,一直给服务器发送数据
while(true) {
//向服务器写出一行数据,并且读取服务器回声回来的一行数据
PrintWriter out = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
// 3,一直发送一直读取
System.out.println("请输入您想要给服务器端发送的数据:");
String input = new Scanner(System.in).nextLine();
out.println(input);//向服务器发送了指定数据
out.flush();//把数据刷出去
String line = in.readLine();//读取回声数据
System.out.println("服务器的回声数据是:"+line);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
4.主要方法
构造方法:
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
常用方法:
Socket accept()
侦听并接受到此套接字的连接。
void close()关闭此套接字。
启动服务:ServerSocket ss = new ServerSocket(端口);
等待客户端发起连接,并建立连接通道:Sokcet socket = ss.accept();
构造方法:
Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
常用方法:
InputStream getInputStream()
返回此套接字的输入流。
OutputStream getOutputStream()
返回此套接字的输出流。
新建Socket对象,连接指定的ip指定的端口:Socket s = new Socket(ip, port);
从Socket获取双向的流:
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
网友评论