1、通信软件的功能
有客户端和服务器端,实现客户端和服务器相互不停的发送和接收消息。
要求发送和接收消息可以同时进行。
使用tcp实现
//-- 读取数据类
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ReadData extends Thread {
private Socket socket;
public ReadData(Socket socket){
this.socket=socket;
}
@Override
public void run() {
super.run();
InputStream inputStream=null;
try {
inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
while (read!=-1){
System.out.println(new String(bytes,0,read));
read=inputStream.read(bytes);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//-- 写数据类
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class WriteData extends Thread {
private Socket socket;
public WriteData(Socket socket){
this.socket=socket;
}
@Override
public void run() {
super.run();
OutputStream outputStream =null;
while (true){
Scanner scanner = new Scanner(System.in);
String s=scanner.nextLine();
try {
outputStream = socket.getOutputStream();
outputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//-- 我作为客户端
import java.io.IOException;
import java.net.Socket;
public class My {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 9000);
new WriteData(socket).start();
new ReadData(socket).start();
}
}
//-- 你作为服务端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
// 一个作为服务器,一个作为客户端
//服务器中可以读写,但是在一个线程中会read与scanner会相互阻塞,将两个阻塞分开到两个线程中即可
public class You {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9000);
//向下转型,在设计类时寻找相同点作为属性,子类没有相同点,可向上转型呢?面向对象
Socket accept = serverSocket.accept();
new ReadData(accept).start();
new WriteData(accept).start();
}
使用Udp实现
//-- 我作为客户端发送消息
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class My implements Runnable {
private int dkh;
public My(int dkh){
this.dkh=dkh;
}
@Override
public void run() {
while (true) {
udpMy();
}
}
void udpMy() {
DatagramSocket datagramSocket = null;
DatagramPacket datagramPacket = null;
try {
datagramSocket = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
byte[] bytes = s.getBytes();//一次全部接受发送,不必固定字节数组的长度
InetAddress locahost = InetAddress.getByName("localhost");
datagramPacket = new DatagramPacket(bytes, 0, bytes.length, locahost, dkh);
datagramSocket.send(datagramPacket);
} catch (Exception e) {
} finally {
}
}
}
//-- 你作为服务端接受消息
package ParcticeDiwuzhou.lx0813.lx.udptx;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class You implements Runnable {
// private Lock lock;
//
// public You(Lock lock){
// this.lock=lock;
// }
private int dkh;
public You(int dkh){
this.dkh=dkh;
}
@Override
public void run() {
while (true) {
udpYou();
}
}
void udpYou() {
DatagramSocket datagramSocket = null;
DatagramPacket datagramPacket = null;
try {
datagramSocket = new DatagramSocket(dkh);
byte[] bytes = new byte[1024];
datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket);
System.out.print("You:");
System.out.println(new String(bytes));
} catch (Exception e) {
} finally {
}
}
}
//-- 开启两个线程我和你可以是客户端的同时也是服务端
public class MyMianThread {
public static void main(String[] args) {
Lock lock=new ReentrantLock();
My my = new My(9600);
Thread thread = new Thread(my);
thread.start();
You you = new You(9601);
Thread thread1 = new Thread(you);
thread1.start();
}
}
//-- You
public class YouMianThread {
public static void main(String[] args) {
Lock lock=new ReentrantLock();
You you = new You(9600);
Thread thread1 = new Thread(you);
thread1.start();
My my = new My(9601);
Thread thread = new Thread(my);
thread.start();
}
}