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

客户端

 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. Python学习笔记 (2.2)Python中的字符编码问题及标准数据类型之String(字符串)

    Python3中的String类型 首先,Python中没有字符类型,只有字符串类型.单个字符按照长度为1的字符串处理,这对于曾是OIER的我来说有点不适应啊. 字符串的表示方法 最常用的就是用一对双 ...

  2. 【BZOJ4398】福慧双修(二进制,最短路)

    题意: 此题中S=1 思路:Orz ManGod秒切此题 我觉得出入边权互换不太直观,就改了一下写法 第一次默认与1有关的第一条出边只出不入,第二次默认只入不出 ..]of longint; head ...

  3. A multiprocessing system including an apparatus for optimizing spin-lock operations

    A multiprocessing system having a plurality of processing nodes interconnected by an interconnect ne ...

  4. 通过代码学习python之@property,@staticmethod,@classmethod

    URL: https://www.the5fire.com/python-property-staticmethod-classmethod.html #coding=utf-8 class MyCl ...

  5. 可恢复的安全rm

    我们常常使用rm去删除一些文件.假设不小手一抖,那么就悲剧了.你们都懂的... 在经历过一次这种慘剧后.决定永远杜绝这种情况.重写写了shell函数.运行安全的rm.这个函数会把要删除的文件按日期备份 ...

  6. matlab初试牛刀__小练习

    % T1 % 最好还是设 h=2 D=1 clear,clc; h=2;D=1; x=-2*D:0.01:2*D; y=h*(x>D)+h/D.*x.*(abs(x)<=D)-h*(x&l ...

  7. effective C++ 读书笔记 条款14 以对象管理资源

    如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...

  8. javaScript 检測 能否够连接指定server

    本文主要讲述怎样在js里面从多个服务端servlet中找到可用的地址 一般项目部署到生产环境之后会有一个生产网段(就是你能够在家訪问)和一个办公网段(仅仅能在公司才干訪问). 我们的项目部署好了之后, ...

  9. 20170410 --- Linux备课资料 --- 压缩与解压缩

    这节课我们来学习一下压缩与解压缩,那什么是压缩与解压缩呢? 联想一下Windows系统: 选中文件,右键选择即可 如果压缩,可以选择要压缩的格式,而解压缩直接选择就可以完成了 Linux是通过命令的方 ...

  10. java 定位工具

    #查看JVM所有进程及启动类信息以及PID jps -mlvV #查看JVM运行各种状态信息,包括GC,类加载,堆内存信息,jit编译信息等jstat -gcutil <PID> (堆内存 ...