(一)TCP编程-线程客户端与服务端的交流

客户端开启线程:
import java.io.IOException;
import java.net.Socket;
/*
 * 一个客户端与一个服务端进行聊天。
 * 1:接收数据,
 * 2:发送数据。
 * 同时进行。:线程。 一个线程负责接收数据,一个线程负责发送数据。
 */
public class ChatClient {
public static void main(String[] args) {
       try {
Socket socket=new Socket("127.0.0.1", 8888);
SendThread sendThread=new SendThread(socket);//实现run接口的写法
new Thread(sendThread).start();//实现run接口的写法
new ReveicerTread(socket).start();//继承run的写法第一种
//ReveicerTread t=new ReveicerTread(socket);//继承run的写法第二种种
//t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端开启线程:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static void main(String[] args) {
      try {
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=serverSocket.accept();
SendThread sendThread=new SendThread(socket);//实现run接口的写法
new Thread(sendThread).start();//实现run接口的写法
new ReveicerTread(socket).start();//继承run的写法第一种
//ReveicerTread t=new ReveicerTread(socket);//继承run的写法第二种种
//t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端线程:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SendThread implements Runnable {
    //创建一个构造函数用来接收socket
private Socket socket;
public SendThread(Socket socket) {
this.socket=socket;
}
OutputStream os=null;
Scanner sc=new Scanner(System.in);
public void run() {
//1.套接字直接传进来,不用创建
//2.获得输出管道
//run是父类方法,不能在抛出异常,因为子类异常要小于父类异常,而修饰符则是要大于等于父类
try {
os=socket.getOutputStream();
String str=null;
while(true){
str=sc.next();
if("886".equals(str)){
break;
}
os.write(str.getBytes());
os.write("\r\n".getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
try {
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端线程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReveicerTread extends Thread {
   //创建一个构造函数用来接收socket
private Socket socket;
public ReveicerTread(Socket socket){
this.socket=socket;
}
     @Override
     public void run() {
     try {
InputStream is=socket.getInputStream();
String ip=socket.getInetAddress().getHostAddress();
int port=socket.getPort();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
int len=-1;
String str=null;
while(true){
str=br.readLine();
if(str==null||"886".equals(str)||"\r".equals(str)||socket==null){
break;
}
System.out.println("发送ip: "+ip+"-端口 "+port+":"+str);
}
} catch (IOException e) {
e.printStackTrace();
}
    // is.close();
//br.close();
//socket.close();
   }
}

转载于:https://my.oschina.net/u/2541146/blog/596450

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值