Fork me on GitHub

服务器 客户端 实现TCP 1--socket

附上其他好的文章的链接 
https://blog.csdn.net/wo541075754/article/details/66971888
https://blog.csdn.net/u012561176/article/details/48183181
https://blog.csdn.net/u010142437/article/details/18039961
https://blog.csdn.net/alen0217/article/details/42558085
https://blog.csdn.net/qq_34444097/article/details/78955511
     小笔记:~Thread t 的意思是声明线程t ,new Thread(this) 的意思是把当前的类实例化为一个线程
该Thread对象调用start()方法后,会执行该对象重写的run()方法,结果也就是Run of Thread,输出完后,run()方法返回,该线程对象的生命周期也就结束了。从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
     finalize方法是Object提供的的实例方法,使用规则如下:当对象不再被任何对象引用时,GC会调用该对象的finalize()方法 finalize()是Object的方法,子类可以覆盖这个方法来做一些系统资源的释放或者数据的清理,可以在finalize()让这个对象再次被引用,避免被GC回收;但是最常用的目的还是做cleanup,Java不保证这个finalize()一定被执行;但是保证调用finalize的线程没有持有任何user-visible同步锁。在finalize里面抛出的异常会被忽略,同时方法终止。当finalize被调用之后,JVM会再一次检测这个对象是否能被存活的线程访问得到,如果不是,则清除该对象。也就是finalize只能被调用一次;也就是说,覆盖了finalize方法的对象需要经过两个GC周期才能被清除。
https://www.cnblogs.com/alsf/p/6852852.html 传到服务器需要用printstream流进行
下面实现客户端 服务器的通信
服务器代码

import java.io.*;
import java.net.*;
//点对点连接
public class Server {
	// 太久没操作会自动停
	public static void main(String[] args) throws IOException {
		// 监听 并传递一个端口
		ServerSocket server = new ServerSocket(2010);// 默认自己ip的地址
		System.out.println("服务器准备就绪");
		// 持续收到消息
		System.out.println("服务器的信息" + server.getLocalPort() + " " + server.getInetAddress());
		// 客户端连接输出
		// 开始接受 服务器不关闭 所以采用true
		while (true) {
			Socket client = server.accept();
			// 持续接收 因为是服务器 所以 不仅仅接受一个
			ClientHandler clientHandler = new ClientHandler(client);
			clientHandler.start();
		      }
	     }
	private static class ClientHandler extends Thread {
		private Socket socket;
		// 持续接受
		private boolean flag = true;
		// socket 是 连接到服务器上
		ClientHandler(Socket socket) {
			this.socket = socket;
		}
		public void run() {
			// 连接成功后 正式运行前先输出客户端的信息
			System.out.println("与" + socket.getLocalAddress() + "连接成功" + "," + socket.getPort());
			try {
				// 接受输入
				PrintStream output = new PrintStream(socket.getOutputStream());
				BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				do {
					String str = input.readLine();
					if (str.equalsIgnoreCase("bye")) {
						flag = false;
						System.out.println("跟" + socket.getInetAddress() + "断开连接");
					} 
					else {
						System.out.println(str);
						//如果没有回送的话会报错
						output.println("回送:"+str.length());
					}
				}while(flag);
 
			} catch (Exception e) {
				System.out.println(e);
				System.out.println("连接异常");
			}
			try {
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

客户端

import java.io.*;
import java.net.*;
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket();
		socket.setSoTimeout(3000);// 超时时间
		// 下面要先运行服务器 不然连接不了 要从服务器端开始建立连接
		socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), 2010));
		System.out.println("已建立连接");// 没建立连接会报错//InetAddress//输入地址
		System.out.println("服务器的主机名+ip地址" + socket.getInetAddress());
		System.out.println("客户端的端口" + socket.getPort());// 2000
		try {
			todo(socket);
		} // 捕捉异常 任何异常
		catch (Exception e) {
			System.out.println("异常关闭");
		}
		socket.close();
		System.out.println("客户端已退出");
	}
	// 发送接受
	private static void todo(Socket client) throws IOException {
		// 键盘输入流
		InputStream in = System.in;
		BufferedReader input = new BufferedReader(new InputStreamReader(in));
		// 得到输出流,并打印
		OutputStream  out = client.getOutputStream();
		PrintStream outprint = new PrintStream(out);
		//得到对方的发过来的消息
		InputStream inputstream = client.getInputStream();
		BufferedReader inputstreamreader = new BufferedReader(new InputStreamReader(inputstream));
		boolean flag = true;
		while(flag) {
		//键盘读取一行
		String str = input.readLine();
		//发送到对方采用的时printStream
		outprint.println(str);
		//读取服务器的消息一行。而还没有
		String s =inputstreamreader.readLine();
		if(s.equalsIgnoreCase("bye")) {	
			System.out.println("跟"+client.getInetAddress()+"断开连接");
			flag = false;
		}
		else//服务器输过来的消息 打印出来
			System.out.println(s);
	}
		outprint.close();
		inputstreamreader.close();
}
}

简洁个人版
服务器

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(5050);
		while (true) {
			Socket client = server.accept();
			System.out.println(client.getPort() + "已上线");
			clientserver c = new clientserver(client);
			c.start();
		}
	}
}
class clientserver extends Thread {
	Socket client;
	clientserver(Socket socket) {
		this.client = socket;
	}
	public void run() {
		System.out.println("与" + client.getInetAddress() + "连接成功");
		try {
			BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
			PrintStream print = new PrintStream(client.getOutputStream());
			boolean flag = true;
			while (flag) {
				String s = input.readLine();
				if (s.equals("bye")) {
					flag = false;
				} else {
					System.out.println(s);
					print.println("已发送");
				}
			}
		} catch (Exception e) {
			System.out.println("连接异常" + client.getPort() + "已下线");
		}
	}
}

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost", 5050);
			System.out.println("与"+socket.getInetAddress()+"连接成功");
			try {
				BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				PrintStream print = new PrintStream(socket.getOutputStream());
				Scanner scanner = new Scanner(System.in);
				while (true) {
					String send = scanner.nextLine();
					print.println(send);
					String str = input.readLine();
					System.out.println(str);
				}
			} finally {
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
posted @ 2019-07-07 21:59  cznczai  阅读(138)  评论(0编辑  收藏  举报