公众号发送:TCP即可获得完整项目代码!(带注释)
还记得HTTP(一)中西瓜籽的话吗?今天它来实现了!
情景再现:
西瓜籽:“这也太简单了,我知道发起一个HTTP请求和建立一个Socket连接区别不大,所以我要手写一个HttpClient(客户程序)和HTTPServer(HTTP服务器)。”
大话再现:
西瓜籽:这对我来说简直信手拈来,下面我就用Java套接字创建一个客户端和服务器端。
项目目录:

项目代码:
package TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
private static ArrayList<String> list = new ArrayList<>();
static {
list.add("zzxkj");
list.add("zxj");
}
public static void main(String[] args) {
ServerSocket serverSocket;
int port = 8080;
System.out.println("默认端口:8080");
try {
//创建绑定到特定8080端口的服务器套接字
serverSocket = new ServerSocket(port);
//返回此套接字正在侦听的端口
System.out.println("服务器正在监听的端口:"+serverSocket.getLocalPort());
while (true){
try {
//等待Client的TCP连接
final Socket socket = serverSocket.accept();
System.out.println("建立了与客户端的TCP连接,该客户端地址为:" + socket.getLocalSocketAddress() + socket.getLocalPort());
service(socket);
}catch (Exception e){
System.out.println("与用户交互失败");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/***响应***/
public static void service(Socket socket) throws Exception{
/**读取请求信息**/
InputStream in = socket.getInputStream();
Thread.sleep(500);//线程休眠,等待Http请求
int size = in.available();
byte[] bytes = new byte[size];
byte[] select = new byte[10];//用于判断该请求是登录,还是上传图片
in.read(bytes);
System.arraycopy(bytes,0,select,0,5);//因为设置Login为登录标志,即前缀,所以取前五个字节
String prefix = new String(select).substring(0,5); //取前缀
//System.out.println(prefix+" "+prefix.length());
/**判断是上传图片还是请求登录,并发送响应结果**/
OutputStream out= socket.getOutputStream();//将字节写入此套接字的输出流
byte[] buffer = new byte[20];
if(prefix.equals("Login")){
// System.out.println(prefix);
String s = new String(bytes); //取完整信息
String follow = s.substring(5); //取用户名
//判断是否存在该用户
if(list.contains(follow)){
buffer = "欢迎光临".getBytes();
System.out.println("登录成功");
}else {
buffer = "该用户不存在".getBytes();
System.out.println("登录失败");
}
}
else {
String result = new String(bytes);
System.out.println(result);//打印结果
buffer = "上传成功".getBytes();
}
out.write(buffer);
Thread.sleep(1000);//线程休眠,等待HTTP得到响应
socket.close();
}
}
package TCP;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private static String host = "localhost";
private static int port = 8080;
private static String path = "XGZ.jpg";
private static String username="zzxkj";
public static void main(String[] args) {
System.out.println("上传文件输入1,请求登录输入2");
Scanner sc = new Scanner(System.in);
int k=sc.nextInt();
if(k==1) {
System.out.println("请输入文件名称(示例:index.html)");
path=sc.next();
try {
doPost(host,port,path);
} catch (Exception e) {
e.printStackTrace();
}
}
else{
System.out.println("请输入用户名(示例:zzxkj)");
username=sc.next();
try {
doLogin(host,port,username);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void doPost(String host , int port , String path) throws Exception{
//建立一个TCP传输
Socket socket = new Socket(host, port);
InputStream in = Client.class.getResourceAsStream(path);
int size = in.available();
byte[] bytes = new byte[size];
in.read(bytes);
/**发送请求**/
OutputStream out = socket.getOutputStream();
out.write(bytes);
//线程休眠等待响应结果
Thread.sleep(2000);
/**接收响应**/
InputStream socketInputStream = socket.getInputStream();
int length = socketInputStream.available();
byte[] buffer = new byte[length];
socketInputStream.read(buffer);
String result = new String(buffer);
System.out.println(result);
socket.close();
}
public static void doLogin(String host , int port , String name) throws Exception{
//建立一个TCP传输
Socket socket = new Socket(host, port);
StringBuilder stringBuilder = new StringBuilder("Login");
stringBuilder.append(name);
byte[] bytes = stringBuilder.toString().getBytes();
/**发送请求**/
OutputStream out = socket.getOutputStream();
out.write(bytes);
//线程休眠等待响应结果
Thread.sleep(2000);
/**接收响应**/
InputStream socketInputStream = socket.getInputStream();
int length = socketInputStream.available();
byte[] buffer = new byte[length];
socketInputStream.read(buffer);
String result = new String(buffer);
//打印结果
System.out.println(result);
socket.close();
}
}
结果演示: 注意:这里我直接将结果打印了,如果上传照片等,应该为乱码格式。
