网络传输--socket
一,socket
1.socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
2.客户端接收
public class ReadThread extends Thread{ //创建一个接收线程,继承Thread线程
private Socket socket; //创建socket对象
public ReadThread(Socket socket){ //构造方法
this.socket = socket;
}
@override
public void run(){ //覆写run方法
BufferedReader reader = null; //设置读取字符流为空
try{
InputStream is = socket.getInputStream;//创建字节流对象
reader = new BufferReader(new InputStreamReader(is));//创建对象
String line = "";//创建一个空字符串
while((line = reader.readerLine()) != null){ //循环读取数据
System.out.println(line); //打印数据
}
}catch (IOException e) { //捕获异常
e.printStackTrace();//在控制台输出异常情况
}finally{
if(reader != null){
try{
reader.close();//关闭字符流
socket.colse();//关闭套接字
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
3,客户端发送数据
Socket socket = new Socket();//创建socket对象,这个对象会自动绑定本地的一个没有被占用的端口号
PrinterWriter pw = null;//创建字符流输出的对象并赋值为null
Scanner scanner = new Scanner(System.in);//
try{
//客户端连接到远程服务器需要指定服务器的ip地址和端口号
socket.connect(new InetSocketAddress("127.0.0.1",2333));
new ReadThread(socket).start();//开启线程读取数据
//输出数据
OutputSream os = socket.getOutputStream();//socket的输出流赋值给字节流变量
pw = new PrintWriter(new OutputStreamWriter(os));//创建字符流对象
while(true){
String line = scanner.nextLine();//键盘输入信心
pw.println(line);//输出给服务端的信息
pw.flush();//清空缓冲区的数据流
}
}
4,服务器端--并发ECHO服务器
Echo是一种小型服务器,将客户端的数据原封不动发回给客户端,这样客户端可判定服务器是否好用
public class EchoThread extends Thread{ //创建服务器线程,继承Thread类
private Socket client;//定义了一个Socket类型变量
public EchoThread(Socket client){ //构造方法
this.client = client;
}
@override
public void run(){ //覆写父类方法
BufferedReader reader = null;
PrintWriter pw = null;
try{
OutputStream os = client.getOutputStream();//socket的输出流赋值给os
InputStream is = client.getInputStream();//socket的输入流赋值给is
reader = new BufferedReader(new InputStreamReader(is));//创建输入字符流对象
is = new PrinterWriter(new OutputStreamWriter(os));//创建输出字符流对象
String line = "";//创建空字符串
while((line= reader.readerLine()) != null){
String echo = "ECHO" + line;
pw.println(echo);
pw.flush();
}
}
}
}