TCP通信
TCP通信-客户端给服务端发送数据 -聊天室版本3-02
—————————-
案例:client可以重复向server发送数据,server在client下线后,给出响应数据.
分析:综合了前面的案例,重复发送数据用到循环,服务端给出响应,
代码实现如下:
package cn_socket通信_聊天室版本302;
import java.io.DataInputStream;
/*
* 客户端发数据到服务端
* 1.Tcp传输,客户端建立的过程.
* 创建tcp客户端socket服务,使用的是socket对象
* 建议该对象一创建就明确目的地,要连接的主机.
* 2.如果连接建立成功,说明数据传输通道已建立。
* 该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入,又有输出。
* 想要输入或输出流对象,可以找Socket来获取。
* 可以通过getOutputStream(),和getInputStream()来获取两个字节流
* 3.使用输出流,将数据写出。
* 4.关闭资源
*/
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/*
* 版本3-1:client可以重复向server发送数据,
* server在client下线后,给出响应数据
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端Socket对象
//连接目标服务器的地址,localhost是目标服务器的地址,10086是目标服务器的端口
Socket socket = new Socket("localhost",10086);
Scanner sc = new Scanner(System.in);
//获取Socket流中的输出流,向服务器输出消息,即发消息到服务器
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
while(true){
//发送数据的大小
String data = sc.nextLine();
byte[] bys=data.getBytes();
//写数据-遵循TLD协议 1:文本数据 2:图片数据 3:音频数据
//发送的数据类型
dos.writeByte(1);
//发送数据长度
dos.writeInt(bys.length);
//写要发送的数据 通常用了流之后要关闭的close()但是这里不用
dos.write(bys);
dos.flush();//刷新
//判断
if("886".equals(data)){
break;
}
}
//接收数据
//接收server的响应数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
//通过socket对象获取输入流,要读取服务端响应的数据
//接收数据类型
byte type=dis.readByte();
//接收数据长度
int len = dis.readInt();
//接收数据内容
byte[] bys= new byte[len];
dis.read(bys);
System.out.println(new String(bys,"utf-8"));
//断开连接 客户端下线 (所有的流也关闭)
sc.close();
socket.close();
}
}
package tedu.cn_socket通信_聊天室版本302;
/*
* 服务端接收客户端发过来的数据,并打印在控制台上。
* 建立tcp服务端的思路:
* 1.创建服务端Soket服务,通过ServerSocket对象
* 2.服务端必须对外提供一个端口,否则客户端无法连接
* 3.获取连接过来的客户端对象
* 4.通过客户端对象获取socket流读取客户端发来的数据
* */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket ss;
static Socket socket;
//static byte type;
//UDP:发送端、接收端(无连接)
//TCP:客户端、服务端(要连接)先启动服务端,再启动客户端
public static void main(String[] args) throws IOException {
//创建服务端对象
ss = new ServerSocket(10086);
//监听应用所在服务器的10086端口
//看有没有客户端连接过来,或者发送消息
//建立连接,获取链接过来的客户端对象
socket=ss.accept(); //接受客户端请求,
//不停地接收此客户端发送的数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true){
//通过socket对象获取输入流,要读取客户端发来的数据
//接收数据类型
byte type=dis.readByte();
//根据type判断进行一些操作
//接收数据长度
int len = dis.readInt();
//接收数据内容
byte[] bys = new byte[len];
dis.read(bys);
String data =new String(bys);
System.out.println(data);
//"886" 意味着Client要下线
if("886".equals(data)){
System.out.println("此客户端下线!");
break;
}
}
//向Client给出响应数据
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//写送数据类型
dos.writeByte(1);
//写数据长度
String data ="接收完毕,您已下线";
byte[] content = data.getBytes("utf-8");
dos.writeInt(content.length);
//写数据内容
dos.write(content);
dos.flush();
}
}
程序运行结果
先运行服务端,后运行客户端