import java.net.*;
import java.io.*;
import java.util.*;
public class TestServer01{// 服务器端 -- 接收一行内容
static Set<String> ipSet = new HashSet<>(); //静态的set集合 哈希Set
public static void main(String[] args)throws Exception{ //Socket 英语:袜子 可以理解为电话线
ServerSocket server = new ServerSocket(12666); //创建Socket服务 并且指定 端口号 相当于门牌号
boolean isRunning = true; //标识符 控制while循环;写true的话是死循环,系统编译不通过,这样骗过系统,才能执行下面的关闭操作
while(isRunning){ //while循环
Socket skt = server.accept(); //接收Socket服务:accept()方法 -- 大堂经理
ServerThread st = new ServerThread(skt); //大堂经理招呼一个 服务员(线程) 去服务来的客人,然后大堂经理继续在大厅迎客
st.start(); //服务员开始服务
}
server.close(); //关闭Socket服务
}
}
class ServerThread extends Thread{ //创建线性的第一种方式 相当于学生类
Socket skt; //创建 Socket属性 相当于学生姓名
public ServerThread(Socket skt){ //创建构造方法 知道为哪个Socket服务 听哪一个大堂经理的
this.skt = skt;
}
@Override
public void run(){
try{ //抛异常try catch
InputStream is = skt.getInputStream(); //通过Socket获得输入流 getInputStream() 不是new!!!
InputStreamReader r = new InputStreamReader(is);//桥转换器:字节 -》字符
BufferedReader br = new BufferedReader(r); //BufferedReader
String str = br.readLine(); //读取一行
String ip = skt.getInetAddress().toString(); //获取ip地址并转成字符串
TestServer01.ipSet.add(ip); //将ip添加到set集合
System.out.println(ip+ " : " + str + " "+TestServer01.ipSet.size() + "/55");//输出ip和内容
br.close(); //关BufferedReader
skt.close(); //关Socket
}catch(Exception e){
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
import java.util.concurrent.*;
public class TestServer02{ // 服务器端 -- 提供图片下载
public static void main(String[] args)throws Exception{
ExecutorService es = Executors.newCachedThreadPool();//创建带缓存机制的线程池 -- 执行器工具类.缓冲机制线程池
ServerSocket server = new ServerSocket(12345); //创建Socket服务 ServerSocket,指定端口号 -- 门牌号
boolean isRunning = true; //设置循环控制变量,避免死循环无法执行之后的关闭操作
while(isRunning){ //while循环
Socket skt = server.accept(); //接收Socket服务accept()方法 -- 大堂经理
EtoakThread et = new EtoakThread(skt); //大堂经理招呼 服务员--线程 服务来的客人
es.submit(et); //服务员开始服务
}
server.close(); //关闭Socket服务
es.shutdown(); //关闭执行器
}
}
class EtoakThread implements Callable<String>{ //创建线程的第三种方式
Socket skt; //创建Socket属性 相当于学生姓名
public EtoakThread(Socket skt){ //构造方法:知道为哪个Socket服务
this.skt = skt;
}
@Override
public String call()throws Exception{ //覆盖call()方法 有返回值 且 能抛异常
FileInputStream fis = new FileInputStream("jay.jpg");//创建输入流对象 new
OutputStream os = skt.getOutputStream(); //通过Socket获得输出流
byte[] data = new byte[65536]; //配合数组完成写出
int len; //规定写出长度
while((len = fis.read(data))!=-1){ //while循环:输入流读不到-1则继续执行
os.write(data,0,len); //输出流写出
}
os.close(); //关输出流
fis.close(); //关输入流
skt.close(); //关Socket
System.out.println(skt.getInetAddress() + "下载完毕");//提示某个ip下载完成
return "ETOAK"; //返回一个字符串
}
}
import java.net.*;
import java.io.*;
import java.util.concurrent.*;
public class TestServer03{ // 服务器端 -- 接收客户端发来的内容 返回相应指定的内容
public static void main(String[] args)throws Exception{
ExecutorService es = Executors.newFixedThreadPool(5); //创建可修复的线程池 执行器类.可修复线程池
ServerSocket server = new ServerSocket(12000); //创建Socket服务 且指定端口号 -- 门牌号
boolean isRunning = true; //设置循环变量控制变量 避免死循环无法执行之后的关闭操作
while(isRunning){ //while循环
Socket skt = server.accept(); //接收Socket服务accept()方法 -- 大堂经理
ServerThread st = new ServerThread(skt); //大堂经理招呼 服务员--线程 服务来的客人
es.submit(st); //开始服务
}
server.close(); //关闭Socket服务
es.shutdown(); //关闭执行器
}
}
class ServerThread implements Runnable{ //创建线程的第二种方式
Socket skt; //创建Socket属性 相当于学生姓名
public ServerThread(Socket skt){ //构造方法:知道为哪个Socket服务
this.skt = skt;
}
@Override
public void run(){ //覆盖run()方法
try{ //try catch处理异常
//1.接
InputStream is = skt.getInputStream(); //通过Socket获得输入流
InputStreamReader r = new InputStreamReader(is); //桥转换器 字节 -》字符
BufferedReader br = new BufferedReader(r); //BufferedReader
String name = br.readLine(); //读一行
//2.化
String result = X.get(name); //类名.get() 获得内容
//3.发
OutputStream os = skt.getOutputStream(); //通过Socket获得输出流
PrintWriter pw = new PrintWriter(os,true); //PrintWriter 且 清空缓冲
pw.println(result); //输出 所获得的内容
pw.close(); //关闭PrintWriter
br.close(); //关闭BufferedReader
skt.close(); //关闭Socket
System.out.println(skt.getInetAddress() + " : " + name + " -> "+result);//打印哪个ip 输入的名字 的结果
}catch(Exception e){
e.printStackTrace();
}
}
}
class X{
public static String get(String name){ //静态get(String)
if(name.contains("吴") || name.contains("老大") ) //判断是否包含特定字
return "天机不可泄露"; //结束方法 返回指定内容
String[] data = {"去陪凢凢","命运多舛","平平淡淡","大富大贵","天命之子"};//String[] 装命运的五种描述
int x = name.hashCode()*17/3-1; //获得名字的hashCode()
long time = System.currentTimeMillis() / (24L*60*60*1000);//获得当前时间的整天数
x += time*53/29; //由名字的hashCode()和时间决定的一个值
x = Math.abs(x); //绝对值
x = x % data.length; //对数组的长度取模获取下标
return data[x]; //返回数组
}
}
import java.io.*;
import java.net.*;
import javax.swing.*;
public class TestClient01{
public static void main(String[] args)throws Exception{
while(true){
String str = JOptionPane.showInputDialog(null,"请输入内容:");
if("88".equals(str)){
break;
}
Socket skt = new Socket("192.168.31.85",12666);
OutputStream os = skt.getOutputStream();
OutputStreamWriter w = new OutputStreamWriter(os,"GBK");
PrintWriter pw = new PrintWriter(w,true);
pw.println(str);
pw.close();
skt.close();
}
}
}
import java.net.*;
import java.io.*;
public class TestClient02{
public static void main(String[] args)throws Exception{
Socket skt = new Socket("192.168.31.85",12345);
InputStream is = skt.getInputStream();
FileOutputStream fos = new FileOutputStream("ok.jpg");
byte[] data = new byte[65536];
int len;
while((len = is.read(data))!=-1){
fos.write(data,0,len);
}
fos.close();
is.close();
skt.close();
}
}
import java.net.*;
import java.io.*;
public class TestClient03{
public static void main(String[] args)throws Exception{
Socket skt = new Socket("192.168.31.85",12000);
OutputStream os = skt.getOutputStream();
PrintWriter pw = new PrintWriter(os,true);
pw.println("张总");
InputStream is = skt.getInputStream();
InputStreamReader r = new InputStreamReader(is);
BufferedReader br = new BufferedReader(r);
String result = br.readLine();
br.close();
pw.close();
skt.close();
System.out.println(result);
}
}