版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/89203051
实现的效果如下
涉及的知识点
1、多线程
2、socket和serversocket的用法以及区别
3、字符串和byte[]数组的转化
服务器代码
1、输入流线程类InputStreamWay.java
package cn.com.server;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class InputStreamWay extends Thread {
// 1.继承Thread类
// 2.重写run()方法
public void run() {
while (true) {
OutputStream out;
try {
out = socket.getOutputStream();
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println("我:" + str);
out.write(str.getBytes());
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 3.因为需要传参过来。所以需要重载一个构造函数
private Socket socket;
public InputStreamWay(Socket socket) {
this.socket = socket;
}
// 4.设置一个全局变量
}
2、输出流线程类OutputStreamWay.java
package cn.com.server;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class OutputStreamWay extends Thread {
// 发送信息给客户端
// 1.继承Thread父类
// 2.重写run()方法
// 3、需要用到一个socket参数,所以我要重载构造函数
public void run() {
while (true) {
InputStream in;
try {
in = socket.getInputStream();
byte[] b = new byte[1024];
int len = 0;
StringBuffer sb = new StringBuffer();
String s = null;
if ((len = in.read(b)) != -1) {
s = new String(b);
sb.append(s);
}
System.out.println("客户端信息:" + sb);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 目的:在其他类里面调用这个线程的时候,需要传入一个参数进来,但是传进来的仅仅是在构造函数里面
// 为了让这个类其他的方法可以共享这个参数,因此我们需要设置一个全局变量,当构造函数有参数传进来的时候,把这个参数赋值给全局变量
private Socket socket;
public OutputStreamWay(Socket socket) {
this.socket = socket;
}
}
3、服务器入口代码
package cn.com.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SSocket {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8090);
Socket socket=server.accept();
System.out.println("----------");
new InputStreamWay(socket).start();
new OutputStreamWay(socket).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取
//
}
客户端代码
1、输入流线程类InputStreamWay.java和服务器的代码一样,
2、输出流线程类OutputStreamWay.java和服务器上面的代码一样,需要注意,在打印信息的时候,把来自客户端信息改成来自服务器信息
3、客户端入口代码
package cn.com.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ServerSocket {
//服务器端
/*author:命运的信徒
* date:2019/4/10
* arm:做一个微型的qq
*/
//客户端发送信息
public static void main(String[] args) {
Socket socket=null;
try {
socket=new Socket("127.0.0.1",8090);
System.out.println("=========");
new InputStreamWay(socket).start();
new OutputStreamWay(socket).start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
世上无难事,只怕有心人!
越是薄弱的地方,越是需要花心思在上面!