支持同时收发的客户端和服务器端

客户端

 import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*; public class ChatClient {
private JTextArea incoming;
private JTextField outgoing;
private PrintWriter writer;
private BufferedReader reader; public static void main(String[] args) {
ChatClient client = new ChatClient();
client.go();
} private void go() {
build_gui();
setup_net();
} private void build_gui() {
JFrame frame = new JFrame("Chat Client");
JPanel panel = new JPanel(); incoming = new JTextArea(15, 50);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane qScroller = new JScrollPane(incoming);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(incoming); outgoing = new JTextField(20);
panel.add(outgoing); JButton button = new JButton("Send");
button.addActionListener(new SendButtonListener());
panel.add(button); frame.add(BorderLayout.CENTER, panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setVisible(true);
} public class SendButtonListener implements ActionListener {
public void actionPerformed(ActionEvent a) {
String msg = outgoing.getText();
try {
writer.println(msg);
writer.flush();
} catch (Exception ex) { ex.printStackTrace(); }
outgoing.setText("");
outgoing.requestFocus();
}
} class ReceiveThreadJob implements Runnable {
public void run() {
String msg;
try {
while ( (msg = reader.readLine()) != null ) {
incoming.append(msg + "\n");
}
} catch (IOException ex) { System.out.println("server disconnected"); }
}
} private void setup_net() {
try {
Socket s = new Socket("127.0.0.1", 4242);
writer = new PrintWriter(s.getOutputStream());
InputStreamReader streamReader = new InputStreamReader( s.getInputStream() );
reader = new BufferedReader( streamReader ); Runnable receive_thread_job = new ReceiveThreadJob();
Thread receive_thread = new Thread( receive_thread_job );
receive_thread.start(); } catch (IOException ex) {
ex.printStackTrace();
}
}
}

服务器端

 import java.io.*;
import java.net.*;
import java.util.ArrayList; public class ChatServer {
BufferedReader reader;
ArrayList<PrintWriter> writer_array = new ArrayList<PrintWriter>(); public static void main(String[] args) {
ChatServer server = new ChatServer();
server.go();
} private void go() {
setup_net();
} private void setup_net() {
try {
ServerSocket serverSock = new ServerSocket(4242);
while (true) {
Socket s = serverSock.accept();
System.out.println("client connected");
InputStreamReader streamReader = new InputStreamReader( s.getInputStream() );
reader = new BufferedReader( streamReader );
PrintWriter writer = new PrintWriter(s.getOutputStream());
writer_array.add(writer);
Runnable server_proc_thread_job = new ServerProcThreadJob();
Thread server_proc = new Thread( server_proc_thread_job );
server_proc.start();
}
} catch (IOException ex) {
ex.printStackTrace();
}
} class ServerProcThreadJob implements Runnable {
public void run() {
String msg;
try {
while ( (msg = reader.readLine()) != null ) {
System.out.println(msg);
for ( PrintWriter writer: writer_array ) {
writer.println(msg);
writer.flush();
}
}
} catch (IOException ex) { System.out.println("client disconnected"); }
}
}
}

Java学习笔记_网络+多线程的更多相关文章

  1. Java学习笔记_网络(2)

    单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...

  2. java学习笔记_网络

    客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...

  3. Java学习笔记(3)----网络套接字服务器多线程版本

    本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器 ...

  4. 7.4 (java学习笔记)网络编程之TCP

    一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...

  5. 【原】Java学习笔记034 - 网络

    package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...

  6. Java学习笔记_ 数据库隔离级别和事务传播行为

    转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结:              很多人 ...

  7. Java精选笔记_网络编程

    网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...

  8. Java学习笔记4(多线程)

    多线程 多个程序块同时运行的现象被称作并发执行.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一条线程,它们会交替执行,彼此间可以进行通信. 进程:在一个操作系统中,每个独立执行的程 ...

  9. Java学习笔记45(多线程二:安全问题以及解决原理)

    线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享 ...

随机推荐

  1. Spring MVC学习总结(12)——Spring MVC集成Swagger时报错{"schemaValidationMessages":[

    在springmvc结合swagger的时候,如果将项目部署到服务器上就会出现问题出现下面的图标: 点开会报错误信息: schemaValidationMessages":[{"l ...

  2. https://gitee.com/tomsun28/bootshiro-------需要研究的项目

    https://gitee.com/tomsun28/bootshiro-------需要研究的项目

  3. springboot 2.x 集成 drools 7.x

    简介:springboot 2.0.4.RELEASE 集成 drools 7.11.0.Final 1.项目结构 2. pom.xml文件 <?xml version="1.0&qu ...

  4. Ubuntu 16.04错误:The update information is outdated this may be caused by network...的问题解决

    说明:这个问题没有最终的解决方案,只有不断的尝试. 错误: The update information is outdated this may be caused by network probl ...

  5. Java并发:线程安全的单例模式

    转载请注明出处:jiq•钦'stechnical Blog 1.饿汉式 public class Singleton { private final static Singleton INSTANCE ...

  6. Java读取数据库数据生成柱状图

    此案例是用swing显示数据的.须要引入jfreechart相关包.不同版本号可能包不同样.本人用的是 此案例在ssi框架下会报错,不用框架就没问题. Java后台逻辑代码: public class ...

  7. 小议:怎样解决创建Web Application失败问题?

    我们都知道微软建议部署SharePoint2013环境的内存至少是12GB.可是有些小型企业在部署On Premise的环境时因为预算有限,仅仅能使用内存是8GB的环境来部署SharePoint201 ...

  8. 使用 Pascal 脚本编写网页, PWP 项目

    下载后得到 pwp.rar 文件. 解压到一个文件夹里面, 比方  e:\my_sys 文件夹下. 设计一下的脚本. 測试能否够执行. <%  uses sysutils; begin      ...

  9. mysql 多日志表结果集合拼接存储过程

    通常单天的日志 仅仅记录当天的日志信息,假设须要查看一月内的日志信息须要对每天的日志表结果集合进行拼接,通经常使用到 union . 储存过程: drop PROCEDURE if EXISTS un ...

  10. js实现存取Map结构的数据

    //控制关联表单元素是否显示 var relateItemMap = {}; for(var i=0; i<formAttributeItemList.length; i++){ var ite ...