Java学习笔记_网络+多线程
支持同时收发的客户端和服务器端
客户端
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学习笔记_网络+多线程的更多相关文章
- Java学习笔记_网络(2)
单向的客户端发送服务器端接收并显示,没有使用多线程 import javax.swing.*; import java.awt.*; import java.io.*; import java.net ...
- java学习笔记_网络
客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...
- Java学习笔记(3)----网络套接字服务器多线程版本
本例给出一个客户端程序和一个服务器程序.客户端向服务器发送数据.服务器接收数据,并用它来生成一个结果,然后将这个结果返回给客户端.客户端在控制台上显示结果.在本例中,客户端发送的数据是圆的半径,服务器 ...
- 7.4 (java学习笔记)网络编程之TCP
一.TCP 1.1 TCP(Transmission Control Protocol 传输控制协议),是一种面向连接的,安全的传输协议,但效率相比于UDP而言比较低. TCP传输时需要确保先建立连接 ...
- 【原】Java学习笔记034 - 网络
package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...
- Java学习笔记_ 数据库隔离级别和事务传播行为
转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结: 很多人 ...
- Java精选笔记_网络编程
网络编程 概述 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(C ...
- Java学习笔记4(多线程)
多线程 多个程序块同时运行的现象被称作并发执行.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一条线程,它们会交替执行,彼此间可以进行通信. 进程:在一个操作系统中,每个独立执行的程 ...
- Java学习笔记45(多线程二:安全问题以及解决原理)
线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享 ...
随机推荐
- nyoj 911 Registration system(map)
Registration system 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 A new e-mail service "Berlandesk&q ...
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...
- web & Rich Text Editor
web & Rich Text Editor 富文本编辑器 http://www.wangeditor.com/ https://github.com/wangfupeng1988/wangE ...
- HDU 1274 递归拼接字符串
题目大意: 根据所给的数字,表示其相连的字符的输出个数,或是下一个括号中的所有字符的输出个数 每一个相互对应的 '(' 和 ')' 中的所有字母均作为一组数据处理 在每一次dfs过程中都处理好这样一个 ...
- [bzoj 1041][HAOI2008]圆周上的整点(枚举)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 分析:实质上是求(a,b,c)勾股数的个数,其中c是确定的. 对于勾股数有一组通式: a ...
- 1154 能量项链 2006年NOIP全国联赛提高组 codevs
1154 能量项链 2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...
- ms sql server 系统表详细说明
sysaltfiles 主数据库 保存数据库的文件 syscharsets 主数据库字符集与排序顺序 sysconfigures 主数据库 配置选项 syscurconfigs 主数据 ...
- Quartz.Net 使用心得(二)
工作中需要做一个简易的Cron字符串生成器,并且要获取生成的Cron后面10次的触发时间来验证. 此问题困扰了我很久时间,CSDN上有一个Java版本的,本人菜鸟,想移植到C#中,语法上怎么也不通过. ...
- apt --fix-broken install
1 自动修复安装出现broken的package 但是,如果还是失败的话,就需要手动进行干预了.
- new (C# Reference)
https://msdn.microsoft.com/en-us/library/51y09td4.aspx In C#, the new keyword can be used as an oper ...