Java中使用Socket和ServerSocket/或者说使用TCP传输数据
TCP传输数据流程图
客户端类/Client
步骤:
1、先创建键盘录入对象
2、new 一个Socket对象,传入服务器端的ip地址和端口号(这个端口号要和服务器的端口号一致)
3、获取输出流对象,想服务器写数据
4、使用While循环语句做到多次输入,直到输入"886"字符串,跳出whlie循环,停止输入
5、获取键盘输入内容
6、将输入内容的字节流写入字节输出流对象
服务器端类/Server
步骤:
1、创建一个ServerSocket对象,将端口号传进去
2、监听客户端的连接
3、使用while循环多次接受数据
4、获取Date对象,使用SimpleDateFormat改变输出格式
5、获取通道中的输入流对象
6、创建字节数组对象,使用字节输入流对象,读取字节数组,返回字符数组长度
7、将传输数据转换为字符串类型
8、获取客户端主机内容,客户端主机ip地址
9、输出数据时间,ip地址,客户端主机名和数据
代码
Client
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
Socket s = new Socket("192.168.7.9", 45678);
OutputStream os = s.getOutputStream();
while(true){
String next = sc.next();
if("886".equals(next)){
break;
}
os.write(next.getBytes());
}
}
}
Server
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(45678);
Socket s = ss.accept();
InputStream is = s.getInputStream();
while(true){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss");
String date2 = sdf.format(date);
byte[] bytes = new byte[1024];
int length = is.read(bytes);
String s1 = new String(bytes, 0, length);
String hostName = s.getInetAddress().getHostName();
String ip = s.getInetAddress().getHostAddress();
System.out.println(date2);
System.out.println(ip+":"+hostName+"发送的消息为:"+s1);
}
}
}
代码演示
先运行服务器端
因为服务器端不先打开的话,客户端先运行无法建立连接
再运行客户端并输入数
观察服务器端
注意
1、客户端类和服务器端类都需要抛出异常
2、先运行服务器端,再运行客户端
3、在同一个局域网下都可以传输数据