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

使用JAVA写的一个简易TCP通讯程序(一)

2017-05-23 14:45 369 查看
好记性不如赖笔头…………

使用TCP测试通讯时,注意必须 先启动服务端,否则客户端会报错。因为TCP是需要三次握手的协议,如果服务器没有启动,握手失败,就会提示“连接异常”的错误

而UDP就没有这个问题,因为它是一种广播式的协议,在发送信息前,它不会去检查服务器有没有启动、存在不存在,它只是把消息发出去,好了,它的工作完成了,不管消息被 收到还是没有被收到。所以它才可以不用管启动顺序。

服务端代码:

package com.ckinghan.tcpServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
//指定接口
public int port;

//构造方法
public TCPServer(int port) {
super();
this.port = port;
//创建线程并启动
Server server = new Server();
Thread thread = new Thread(server);
thread.start();
}

class Server implements Runnable{

@Override
public void run() {
//创建对象
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader reader =null;
try {
//实例化对象
serverSocket = new ServerSocket(port);
//提示服务端启动
System.out.println("端口号为:"+port+"的服务启动成功……");
//监听并获取socket
socket = serverSocket.accept();
//获取输入流
InputStream inputStream = socket.getInputStream();
//将字节流转换为字符流
reader = new BufferedReader(new InputStreamReader(inputStream));
//获取IP
InetAddress inetAddress = serverSocket.getInetAddress();
//接收到的信息
String message = null;
//一直循环获取消息
while (true) {
//如果接收到的消息不为Null
if((message = reader.readLine()) != null){
//如果接收到的消息为close或exit,则退出对话
if("close".equals(message.toLowerCase()) || "exit".equals(message.toLowerCase())){
System.out.println(inetAddress.getHostAddress()+" 的用户已退出会话");
break;
}
//输出会话的内容
System.out.println(inetAddress.getHostAddress()+" 的用户说:"+message);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
try {
if(reader != null)
reader.close();
if(socket != null)
socket.close();
if(serverSocket != null)
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}

public static void main(String[] args) {
//启动服务端
new TCPServer(12000);
}

}


客户端代码:
package com.ckinghan.tcpServer;

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

public class TCPClient {
//连接的服务器IP
private String ip;
//连接服务器的端口
private int port;
//构造 方法
public TCPClient(String ip,int port) {
super();
this.ip = ip;
this.port = port;
//创建线程并启动
Client client = new Client();
Thread thread = new Thread(client);
thread.start();
}

class Client implements Runnable{

@Override
public void run() {
//创建对象
Socket socket = null;
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
try {
//实例化对象
socket = new Socket(ip, port);
//获取socket的输出流,以便将内容发送给服务器
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//从控制台接收内容
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//要发送的内容
String message = null;
//一直循环
while (true) {
//提示输入
System.out.print("我说:");
//如果用户要发送的信息不为null
if((message = bufferedReader.readLine()) != null){
//换行
System.out.println();
//检查用户是否要退出
if("exit".equals(message.toLowerCase()) || "close".equals(message.toLowerCase())){
System.out.println("退出会话成功");
break;
}
//向服务器写入要发送的消息
bufferedWriter.write(message);
//注意:这里是重点,换行
bufferedWriter.newLine();
//清空缓存将信息发送过去
bufferedWriter.flush();

}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
try {
if(bufferedWriter != null)
bufferedWriter.close();
if(bufferedReader != null)
bufferedReader.close();
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}

public static void main(String[] args) {
new TCPClient("127.0.0.1",12000);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐