简单的TCP/java聊天室
程序员文章站
2024-03-22 17:59:34
...
简单的TCP/java聊天室普通版和加强版
java聊天室普通版(TCP)
大家好,我是一名在校大大一学生,关于这个TCP网络编程,我是一个星期前刚刚进入学习java网络编程,刚开始的时候,各种看视频,查资料,上论坛,但是对于某些地方还是一知半解,我这个东西可能对于像我这样的小伙伴有些帮助,另一方面是想加深记忆。
话不多说,我也不会大佬们一样会一些底层原理,靠自己理解写的,大佬们轻点喷。。。
话不多说,先介绍我这个普通版。
因为是Java聊天室普通版,先大家理解一下运作过程,缺点在于需要双方互相发消息后才能接受到消息,因为接收(输入)程序在发送(输出)程序之后
刚刚来的时候,我一直被输入是发送还是接收弄得都魔神了。
大家需要去看看IO的运转原理,在下表达不太好,就不献丑了。
package ccx;
import com.sun.security.ntlm.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器
public class javaDemo01 implements Runnable{
static ServerSocket serverSocket=null;
static Socket socket=null;
static int number=0;
static Socket[] sockets=new Socket[20];
public javaDemo01(){
try {
serverSocket=new ServerSocket(1101);
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
javaDemo01 javaDemo01=new javaDemo01();
System.out.println("服务器已开启\n");
while(true){
try{
socket=serverSocket.accept();
number++;
sockets[number]=socket;
System.out.println("第"+number+"个用户连接");
}catch(IOException e){
e.printStackTrace();
}
Thread t1=new Thread(javaDemo01);
t1.start();
}
}
@Override
public void run() {
try {
while (true) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//键盘输入的内容放入br
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());//socket获取dos输出的字节流(发送)
DataInputStream dis=new DataInputStream(socket.getInputStream());//socket获取dis输入的字节流(接收)
String str=br.readLine();//把br类型转换成String类型
dos.writeUTF(str);//把str写入dos
//获取消息
System.out.println(dis.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package ccx;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class javaDemo02 implements Runnable{
static Socket socket=null;
public javaDemo02() throws IOException {
socket=new Socket("localhost",1101);
InetAddress s=socket.getInetAddress();
System.out.println(s+"连接到服务器\n");
}
public static void main(String[] args) throws IOException {
javaDemo02 javaDemo02=new javaDemo02();
Thread t1=new Thread(javaDemo02);
t1.start();
}
@Override
public void run() {
try {
while(true) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
DataInputStream dis=new DataInputStream(socket.getInputStream());
String str=br.readLine();
dos.writeUTF(str);
System.out.println(dis.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端与客户端的区别其实不多,socket=new Socket(“localhost”,1101); 也就是连接到 socket=serversocket.accept(); 说来就是一个套娃
这里为了没有关闭流,大家不要养成我这个坏毛病,以后容易报错。
上加强版!加强版也就是解决了需要双方互发消息才能接收消息的毛病,答案就是在加线程!
package TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//服务器
public class server implements Runnable{
static ServerSocket serverSocket=null;
static Socket socket=null;
static BufferedReader br=null;
public static void main(String[] args) throws IOException {
serverSocket=new ServerSocket(1101);
socket=serverSocket.accept();
server server=new server();
Thread t1=new Thread(server);
t1.start();
System.out.println("服务器已开启");
while(true){
receive receive=new receive(socket);
}
}
@Override
public void run() {
while(true){
try {
br=new BufferedReader(new InputStreamReader(System.in));
send send=new send(socket,br);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
//客户端
public class client implements Runnable{
static Socket socket=null;
static BufferedReader br;
public static void main(String[] args) throws IOException {
socket=new Socket("localhost",1101);
client client=new client();
Thread t1=new Thread(client);
t1.start();
System.out.println("client going to start!");
while(true){
receive receive=new receive(socket);
}
}
@Override
public void run() {
while(true){
try {
br=new BufferedReader(new InputStreamReader(System.in));
send send=new send(socket,br);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package TCP;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
//发送线程
public class send{
DataOutputStream dos=null;
public send(Socket socket,BufferedReader br) throws IOException {
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
String str=br.readLine();
dos.writeUTF(str);
}
}
package TCP;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
//接收线程
public class receive {
DataInputStream dis=null;
public receive(Socket socket) throws IOException {
DataInputStream dis=new DataInputStream(socket.getInputStream());
System.out.println(dis.readUTF());
}
}
最重要的还是需要自己去敲代码,你才能发现自己隐藏的问题。
上一篇: 微服务学习之02支付模块构建
推荐阅读
-
简单的TCP/java聊天室
-
DBCP连接池的最简单应用(用于ORACLE数据库) 博客分类: Oracle[Java|C++|C#|Python]Database General
-
做几道简单的java题 博客分类: java
-
java单链表-带头结点和不带头结点单链表的简单实现
-
mybatis如何实现注解sql的简单例子 博客分类: java mybatissql注解
-
用 Java 创建一个简单的 HTTP Web 服务器
-
Java Socket编写一个简单的Web服务器
-
使用JAVA类对Cookie的简单操作进行封装
-
MD5加密、解密的简单java实现
-
C++程序员学Java系列之十五:自定义类的简单使用