首页 > 编程语言 >JAVA网络编程TCP实现聊天功能,附在IDEA中同时运行2个或以上相同的java程序

JAVA网络编程TCP实现聊天功能,附在IDEA中同时运行2个或以上相同的java程序

时间:2022-11-27 00:11:06浏览次数:48  
标签:java Socket IDEA TCP import line JAVA 客户端

在IDEA中同时运行2个或以上相同的java程序

在日常编写测试代码时,有时候会需要在idea上同时运行两个及以上相同的java程序,如:想运行两个CLIENTLOGIN测试聊天室效果。

1.点击Edit Configurations…

2.点击Modify options开启下拉框

3.进行如图所示的勾选

4.即可在IDEA中同时运行2个或以上相同的java程序

 

 

注:上述为新版本idea设置方法 若你的idea为老版本 按以下步骤进行设置:

1.按照新版本方法(上面方法第一步)进入设置窗口

2.如图进行勾选

 

1.TCP通信原理


TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网路虚拟链路,一旦建立虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信!
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类。也就是说,客户端是通过Socket类实现的,而服务端是通过ServerSocket实现的。

 

2.TCP发送数据的步骤

1.创建客户端的Socket对象(Socket);
2.获取输出流,写数据;
3.使用打印流装饰输出流;
4.释放资源。
按照上述步骤编写的代码如下所示:

 

package com.example.demo.chat;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        //创建客户端Socket对象
        Socket socket = new Socket("127.0.0.1",9999);
        //获取输出流写数据
        OutputStream out = socket.getOutputStream();
        PrintStream ps = new PrintStream(out);
        Scanner scanner = new Scanner(System.in);
        String line =null;
        while(true){
            System.out.println("请说");
            line = scanner.nextLine();
            if("end".equals(line))
                break;
            ps.println(line);
        }
        scanner.close();
        ps.close();
        out.close();
    }
}

 

3.TCP接收数据的步骤

1.创建服务器端的Socket对象(SocketServer);
2.监听客户端的连接;
3.获取输入流,读数据,并显示在控制台;
4.使用BufferReader装饰输入流对象;
5.释放资源。
按照上述步骤编写的代码如下所示:

 

package com.example.demo.chat;

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

public class TcpServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器已启动,正在监听客户端的连接");
        ServerSocket serverSocket = new ServerSocket(9999);
        //监听客户端的连接
        Socket socket = serverSocket.accept();
        //获取输入流
        InputStream inputStream = socket.getInputStream();
        //使用BufferedReader装饰输入流
        BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while((line=br.readLine())!=null){
            System.out.println("服务器收到的信息:"+line);
        }
        //释放资源
        br.close();
        socket.close();
        serverSocket.close();
    }

    }

4.效果展示

客户端执行效果演示:

 

服务器执行效果演示:

 

另外:需要注意的是,程序运行的时候需要先启动服务器端的程序,以便于服务器可以首先监听客户端的连接,否则运行程序会报服务器拒绝连接的错误


而由于一般Java程序运行的时候只有一个主线程和一个垃圾回收线程,因为我们程序的客户端的主线程一直在监听用户的输入数据,所以,如果想要实现客户端与服务器的双向聊天,需要使用到多线程来解决,有兴趣的小伙伴可以自己尝试一下。

标签:java,Socket,IDEA,TCP,import,line,JAVA,客户端
From: https://www.cnblogs.com/ZhuAo/p/16928698.html

相关文章

  • java9
    Java9新特性Java9发布于2017年9月22日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍Java9的新特性。Java9新特性模块系......
  • 基于java+swing的图书管理系统
    功能展示登录管理员-主界面管理员-增加书籍管理员-更新和删除书籍管理员-查找书籍管理员-查找所有书籍管理员-添加用户管理员-更新和删除用户管理员-查找......
  • Javascript(笔记53) - promise - 3 几个关键问题
    如何改变Promise的状态?1)resolve(value):如果当前是pending 就会变为resolved(或fulfilled); 2)reject(reason):如果当前是pending 就会变为rejected; 3) 抛出异常:如......
  • java中abstract详解
     Abstract(抽象)可以修饰类、方法 如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。 Abstract可以将子类的共性最大限度的抽取出来,放......
  • Java基础——继承(Extends)
    使用extends(继承)有什么好处?使用继承可以实现代码的重用,通过继承,子类可以继承父类的成员变量及成员方法,同时子类也可以定义自己的成员变量和成员方法。届时,子类将具有父类......
  • java——@ApiOperation注解
    @RequestMapping(value="/add",method=RequestMethod.POST)@ApiOperation(value="添加用户")publicsynchronizedBaseResponse<Long>addUser(@RequestBody......
  • javascript 执行上下文
    <script>//执行上下文,顺序执行到此出会产生一个全局的执行上下文(ECG),并把全局ECG放到ECS(执行上下文栈)中//VO:GO(globanobject)对浏览器而言,window即......
  • TCP/IP 网络模型
    一、应用层应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。二、传输层在传输层会有两个传输协议,分别是TCP和UDP。TCP的全称叫传输控制协议(Transmis......
  • Java控制台输出进度条
    源码packagecom.yang.restdemo.util;importjava.util.concurrent.TimeUnit;importjava.util.stream.Stream;/***@description:进度条*@author:YangJia......
  • 用JStack和Top分析Java进程CPU占用率
    在知道哪个Java进程CPU占用率过高以后:1.使用命令jstackPID命令打印出CPU占用过高进程的线程栈,例如jstack12012>12012.txt2.使用top-H-pPID命令查看对应进程是哪......