Java使用TCP聊天程序
前面使用了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聊天程序的更多相关文章
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- Java使用UDP聊天程序
主要想测试Java UDP通信.Java UDP使用DatagramSocket和DatagramPacket完成UDP通信 主要思路: 1.本机通信,ip地址为:127.0.0.1 2.开一个线程监 ...
- Java 之 TCP 通信程序
一.概述 TCP 通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server). 两端通信时步骤: 1.服务端程序,需要事先启动,等待客户端的连接: 2. ...
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...
- 网络编程应用:基于TCP协议【实现一个聊天程序】
要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1; import java.io.IOException; impor ...
- java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...
- Java网络编程以及简单的聊天程序
网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...
- Java网络编程——UDP聊天程序
UDP简介 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报.在OSI模型中,UDP位于第四层--传输层,处于IP协议额上一层.UDP有不提供数据报分组.组装以及不能对数据报排序 ...
- 仿QQ聊天程序(java)
仿QQ聊天程序 转载:牟尼的专栏 http://blog.csdn.net/u012027907 一.设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本 ...
随机推荐
- ant实例
<?xml version="1.0" encoding="UTF-8" ?> <project name="javaTest&qu ...
- NPOI.XWPF生成WORD,设置Table单元格的背景色
tr.GetCell().SetColor("#fbd4b4");
- php中的各种header整理
<?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...
- Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
Home / Qt 学习之路 2 / Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON 豆子 ...
- bytes和str之间的转换
1.方法:decode解码(二进制转换成字符串) encode与上相反
- HDU - 3949 线性基应用
题意:求第\(k\)小的异或和 要点: 1.线性基能表示原数组的任意异或和,但不包括0,需特判(flag) 2.线性基中的异或组合只有\(2^{|B|}-1\)个,如果可以异或为0,则组合数为\(2^ ...
- POJ - 2676 暴搜 注意实现细节
经典sudoku问题 按部就班就好 一定要注意细节 大于1还是大于等于1 r c越界判断 judge时0的特判 blabla居然磨了2个小时 改了很多地方所以实现得有点冗余,反正能A吧 /*H E A ...
- [转] 利用dockerize模板为容器内应用生成配置文件和环境变量
[FROM] https://blog.csdn.net/liucaihong123/article/details/51945413 首先试验一下dockerize的可用性: 最近一个docker容 ...
- mysql远程连接详细配置
2018-11-06 CentOS 配置MySQL允许远程登录 Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下 ...
- 剑指offer——面试题8:二叉树的下一个节点
// 面试题8:二叉树的下一个结点 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...