服务器代码
tcp_server.java
package com.tcp.com;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class tcp_server {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8889);
System.out.println("-------服务器已启动----------");
Socket socket = server.accept();
System.out.println("一个客户端建立连接");
String msg="欢迎使用";
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true){
String str=dis.readUTF();
System.out.println("服务器-接收到->客户端数据:"+str);
dos.writeUTF(str);
System.out.println("服务器发送数据给客户端:"+str);
}
//输出流
/*
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream()));//字节流
bw.write(msg);
bw.newLine();
bw.flush();//刷新该流的缓冲
*/
// //将表示长度信息的两个字节写入输出流,后跟字符串 s 中每个字符的 UTF-8 修改版表示形式
// dos.writeUTF(msg);
// dos.flush();
}
}
客户端代码:
tcp_client.java
package com.tcp.com;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class tcp_client
{
public static void main(String [] args) throws UnknownHostException, IOException
{
Socket client = new Socket("localhost",8889);
//创建发送的线程类对象
Send send = new Send(client);
//创建接收的线程类对象
Receive receive = new Receive(client);
//创建Thread类对象并启动线程
new Thread(send).start();
new Thread(receive).start();
}
}
客户端接收线程
Receive.java
package com.tcp.com;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class Receive implements Runnable{//具备多线程能力
private DataInputStream dis;
private boolean flag=true;
public Receive(Socket client) {
try {
dis = new DataInputStream(client.getInputStream());
} catch (IOException e) {
flag=false;
CloseUtil.closeAll(dis,client);
}
}
private String getMessage(){
String str = "";
try {
str = dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
flag=false;
CloseUtil.closeAll(dis);//IO流进行关闭
}
return str;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(flag){
System.out.println(this.getMessage());
}
}
}
客户端send线程:
Send.java
package com.tcp.com;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Send implements Runnable{
//从键盘获取数据
private BufferedReader br;
//发送数据的数据流
private DataOutputStream dos;
private boolean flag=true;
//Send方法可以重载 (方法名相同,参数不同,返回值不同)
public Send() {
br = new BufferedReader(new InputStreamReader(System.in));//键盘获取数据
}
public Send(Socket client ){
this();//调用本类的无参构造方法
try {
dos = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
flag=false;
CloseUtil.closeAll(dos,client);
}
}
//获取信息的方法
private String getMessage(){
String str="";
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
flag = false;
CloseUtil.closeAll(br);//流关闭
}
return str;
}
private void send(String str){
try {
dos.writeUTF(str);
dos.flush();//清空缓冲
} catch (IOException e) {
// TODO Auto-generated catch block
flag = false;
CloseUtil.closeAll(dos);//流关闭
}
}
@Override//重写
public void run() {
while(flag){
this.send(getMessage());
}
}
}
CloseUtil.java
package com.tcp.com;
import java.io.Closeable;
public class CloseUtil {
public static void closeAll(Closeable... able) /*...为可变参数*/{
for(Closeable c:able){
if(c!=null){
try {
c.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
}
运行步骤1:
先运行tcp_server.java
再运行tcp_client.java
在client中断输入hello world
结果如图所示:
运行结果如图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190704161128560.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5OTc1Mg==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190704161256559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5OTc1Mg==,size_16,color_FFFFFF,t_70)