前面使用了UDP进行通信的聊天程序

现在做一个用TCP进行通信的聊天程序

原理:

ServerSocket Socket

1.开一个线程监听端口,准备接收消息

2.不断接受消息发送到目的端口

P.S.因为TCP是面向连接的所以中间要注意先后顺序,代码写得有点乱

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; /**
* 聊天程序
* TCP实现
* 开一个线程监听一个端口,接收消息
* @author GXF
*
*/
public class TcpChatWindow {
private int destPort; //目的端口
private int listenPort; //监听端口
private Socket socketToSendMessage; //发送消息的socket public TcpChatWindow(int destPort, int listenPort){
this.destPort = destPort;
this.listenPort = listenPort; //init
init();
} /**
* 接收消息线程
* @author GXF
*
*/
class ReceiveMessageThread implements Runnable{
//接收消息socket
private ServerSocket receiveMessageSocket; @Override
public void run() {
//init
init();
while(true){
try {
Socket clientSocket = receiveMessageSocket.accept();
InputStream inputStreamOfClientSocket = clientSocket.getInputStream();
byte buff[] = new byte[1024];
int lengthOfMessage = -1;
StringBuilder sb = new StringBuilder();
//read message
while((lengthOfMessage = inputStreamOfClientSocket.read(buff)) > 0){
sb.append(new String(buff, 0, lengthOfMessage));
}//while
//输出消息到控制台
System.out.println(sb.toString());
//关闭socket
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 对线程进行初始化
*/
public void init(){
try {
receiveMessageSocket = new ServerSocket(listenPort);
} catch (IOException e) {
e.printStackTrace();
}
} } //初始化操作
private void init(){ //start ReceiveMessageThread
Thread receiveMessageThread = new Thread(new ReceiveMessageThread());
receiveMessageThread.start();
//input message and send message
while(true){
Scanner scanner = new Scanner(System.in);
String messageToSend = scanner.nextLine();
// getSocketToSendMessage();
sendMessage(messageToSend);
scanner.close();
} } /**
* 向对方发送消息
* @param message
*/
public void sendMessage(String message){
try {
Socket socketToSendMessage = new Socket(InetAddress.getByName("127.0.0.1"), destPort);
OutputStream outputStreamOfClientSocket = socketToSendMessage.getOutputStream();
byte bytesOfMessage[] = message.getBytes();
outputStreamOfClientSocket.write(bytesOfMessage);
socketToSendMessage.close();
} catch (IOException e) {
e.printStackTrace();
}
} //获取发送消息的socket
public Socket getSocketToSendMessage(){
if(socketToSendMessage == null){
try {
socketToSendMessage = new Socket(InetAddress.getByName("127.0.0.1"), destPort);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return socketToSendMessage;
} public static void main(String args[]){
if(args.length != 2){
System.out.println("usage: java TcpChatWindow destport listenport");
return;
}
int destPort = Integer.valueOf(args[0]);
int listenPort = Integer.valueOf(args[1]); TcpChatWindow chatWindow = new TcpChatWindow(destPort, listenPort);
}
}

Java使用TCP聊天程序的更多相关文章

  1. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  2. Java使用UDP聊天程序

    主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...

  3. Java 之 TCP 通信程序

    一.概述 TCP 通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server). 两端通信时步骤: 1.服务端程序,需要事先启动,等待客户端的连接: 2. ...

  4. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  5. 网络编程应用:基于TCP协议【实现一个聊天程序】

    要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...

  6. java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

    java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

  7. Java网络编程以及简单的聊天程序

    网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...

  8. Java网络编程——UDP聊天程序

    UDP简介 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报.在OSI模型中,UDP位于第四层--传输层,处于IP协议额上一层.UDP有不提供数据报分组.组装以及不能对数据报排序 ...

  9. 仿QQ聊天程序(java)

    仿QQ聊天程序 转载:牟尼的专栏 http://blog.csdn.net/u012027907 一.设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本 ...

随机推荐

  1. 题解 P2960 【[USACO09OCT]Milkweed的入侵Invasion of the Milkweed】

    题目链接 首先这道题是一道经典的BFS.非常适合刚刚学习深搜的同学. 现在分析一下这个问题.首先,每周是八个方向.就是一圈. 也就是说入侵的范围关于时间是成辐射型扩散.让求最大时间. 也就是完美的BF ...

  2. apache ab性能测试实践

    E:\developtools\apache ab\httpd-2.4.25-x86-vc14-r1\Apache24\bin>ab -n 15000 -c 600 "http://1 ...

  3. 八大排序算法的python实现(一)直接插入排序

    刚参考网上的以及书上的资料把这八大算法又复习了一遍,感悟就是:有些算法原理真的很简单,一看就懂,但实现起来总是有这样那样的问题. 闲言少叙,先贴代码,之后再以自己的理解,以及自己在理解与实现的过程中遇 ...

  4. Sql server inner join......on

    --查询的时候,如果表中有重名的列,此时,应该在通过 表名.列名 的方式来限定指定的列是哪张表中的.select PhoneNum.pid, PhoneNum.pname, PhoneNum.pcel ...

  5. flex布局浅谈

    flex布局浅谈和实例 阿基米德曾说给我一个支点我可以撬动地球,而拥有flex基本可以撬动所有的布局. 1.flex布局基本介绍及效果展示 工欲善其事必先利其器,来来来,一起看下基础知识先(呵~,老掉 ...

  6. Android TextUtils工具类的使用

    1.采用File类,在指定目录下读写数据 java后台代码为: (1)向app的/data/data/com.example.lucky.helloworld目录下写入文本(涉及IO的读写操作) pa ...

  7. kotlin spring @value 注解

    spring boot和kotlin里静态类使用@Value注解配置解决方案前言spring boot里默认是不能给静态属性使用@Value赋值的.所以这里使用中间变量过渡绑定. 方案//applic ...

  8. LeetCode15. 三数之和

    15. 三数之和 描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...

  9. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  10. Codeforces 1136D Nastya Is Buying Lunch (贪心)

    题意: 给一个序列和一组交换序列(a,b),当且仅当a在b的前面(不允许有间隔),这两个数才能交换,问最后一个数最多能移动多少个位置. 分析: 这题是思路是十分的巧妙呀 , 用一个数组num[x]  ...