您的位置:首页 > 理论基础 > 计算机网络

Java通过TCP实现聊天功能

2013-09-23 15:21 639 查看
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("连接服务器异常!");
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java tcp udp socket