1、首先得明白TCP/UDP的区别:

      TCP:传输安全,基本不会丢包,Client端发送消息Server端一定的回复,不然就会一直等待和不能再发,(可以去看哈TCP的3次握手)。

      UDP:传输不安全,可能会丢包,比如通过网线传输时候网线过长电信号减弱,就会导致丢包,或者路由器接受的请求过多,你的请求得排队,时间长了可能就会丢掉,UDP不管是否建立连接,只管往对方发数据(不管对方响应与否都可以往对方发数据)。应用:很多网络游戏、QQ(比如视频聊天有些时候视频会卡,断断续续的)等。


下面写的“退出”应该是“推出”-------------------------------


2、Server端代码:

package com.mqp.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * tcp协议的服务器端
 * 
 * @author Administrator
 * 
 *         tcp中客服端是Socket,服务器端是ServerSocket udp(user
 *         data)中DatagramPacket,DatagramSocket通过数据包和数据插口进行连接和传输
 * 
 */

// 这是一个典型的TCP的传输模式,一方请求,另一方必须应答,否则,就会无限的等待
// 这就是和UDP的区别,UDP不考虑接受方是否接到请求(不管是否双方已经连接上),只管发送自己的消息
// 生活的大部分游戏和很多应用都是采用UDP协议
// 现在Java退出了异步传输机制,所以很大部分不会用到TCP协议
public class TCP_Server {

	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(8888);// 服务器端开启端口监听

			Socket socket = server.accept();// 接受连接

			// 接受客服端发送的消息
			BufferedReader br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			System.out.println("客服端:" + br.readLine());// 输出屏幕上得到的数据
			
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));// 获得输出流
			PrintWriter pw = new PrintWriter(bw);
			// 获得屏幕输入的数据
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					System.in));
			String readline = reader.readLine();
			while (!"bye".equalsIgnoreCase(readline)) {
				pw.println(readline);// 获得屏幕的数据输出到客服端
				pw.flush();
				System.out.println("服务器端:" + readline);// 输出屏幕上得到的数据
				System.out.println("客服端:" + br.readLine());// 输出屏幕上得到的数据
				readline = reader.readLine();// 继续读取
			}

			br.close();
			pw.flush();
			pw.close();
			reader.close();
			System.exit(0);// 没循环了系统退出

		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("端口号监听异常!");
		}
	}

}



3、Client端代码:

package com.mqp.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.ResultSet;

public class TCP_Client {

	public static void main(String[] args) {

		try {
			// 注意:对于客服端的端口号不一定是8888,这是由客服端的PC机自动分配的,每一次用的端口号可能都不一样
			Socket socket = new Socket("localhost", 8888);

			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));

			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));
			PrintWriter pw = new PrintWriter(bw);

			// 获得服务器端发送的数据
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			String readline = br.readLine();
			while (!"bye".equalsIgnoreCase(readline)) {
				pw.println(readline);
				pw.flush();
				System.out.println("客服端:" + readline);// 输出屏幕上得到的数据
				System.out.println("服务器端:" + reader.readLine());// 输出屏幕上得到的数据
				readline=br.readLine();//继续读取下一行的数据上
			}

			br.close();
			pw.flush();
			pw.close();
			System.exit(0);// 系统退出

		} catch (UnknownHostException e) {
			e.printStackTrace();
			System.out.println("找不到服务器IP!");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("连接服务器异常!");
		}
		
	}

}