使用JAVA写的一个简易TCP通讯程序(一)
2017-05-23 14:45
369 查看
好记性不如赖笔头…………
使用TCP测试通讯时,注意必须 先启动服务端,否则客户端会报错。因为TCP是需要三次握手的协议,如果服务器没有启动,握手失败,就会提示“连接异常”的错误
而UDP就没有这个问题,因为它是一种广播式的协议,在发送信息前,它不会去检查服务器有没有启动、存在不存在,它只是把消息发出去,好了,它的工作完成了,不管消息被 收到还是没有被收到。所以它才可以不用管启动顺序。
使用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); } }
相关文章推荐
- 使用JAVA线程写的一个UDP简易通讯程序(三)
- 使用JAVA写的一个简易通讯程序(一)
- 使用Java编写一个简易的本地文件的检索相关字的程序
- 一个使用多线程删除指定目录及子目录下所有指定文件的Java程序(源码)
- 如何使用java程序打开一个文件?
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
- 在启动脚本中一般使用类似如下的命令执行一个Java程序
- java中使用向量做的一个简单翻页程序
- 如何使用myeclipe编一个java程序[转]
- 使用java写一个没有main方法的“Hello World”程序(摘自java核心技术.卷I)
- 5、 java 编写程序拷贝一个文件, 尽量使用效率高的方式.
- ETL工具kettle与java结合使用程序生成一个简单的转化文件
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- Linux下使用vi 编写一个c程序和java程序
- 一个使用Java读取串口的程序
- 一个使用JAVA编写的类似按键精灵的程序
- 8、 java 先写一个程序,打印从1到100的值。之后修改程序,通过使用break关键词,使得程序在打印到98时退出。然后尝试使用return来达到相同的目的。
- 一个使用JAVA编写的类似按键精灵的程序
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序