java19 先开服务器,再开客户端
- 先开服务器,再开客户端。
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- /**
- * 创建服务器
- * 写出数据:输出流
- * 读取数据:输入流
- */
- public class Server {
- public static void main(String[] args) throws IOException {
- ServerSocket server =new ServerSocket();
- Socket client =server.accept();
- //写出数据
- //输入流
- DataInputStream dis = new DataInputStream(client.getInputStream());
- String msg =dis.readUTF();
- //输出流
- DataOutputStream dos = new DataOutputStream(client.getOutputStream());
- dos.writeUTF("服务器-->"+msg);
- dos.flush();
- }
- }
- import java.io.BufferedReader;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * 创建客户端: 发送数据+接收数据
- * 写出数据:输出流
- * 读取数据:输入流
- */
- public class Client {
- public static void main(String[] args) throws UnknownHostException, IOException {
- Socket client = new Socket("localhost",);
- //把控制台输入封装成输入流
- BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
- DataOutputStream dos = new DataOutputStream(client.getOutputStream());
- DataInputStream dis = new DataInputStream(client.getInputStream());
- while(true){
- String info =console.readLine();//根据输入的换行符读取一行。
- //输出流,输出去在读进来。
- dos.writeUTF(info);
- dos.flush();
- //输入流
- String msg =dis.readUTF();
- System.out.println(msg);
- }
- }
- }
- 聊天室:
- . 客户端可以发送数据 +接收数据 独立的
- . 每个客户端创建一个线程,彼此相互独立。
- 输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立。
- a客户端发送数据给服务器,服务器中转给b、c客户端。所以服务器要为每一个客户端建立一个线程。服务器为每一个客户端服务时,每个客户端都有输入流和输出流,客户端的输入流和输出流也是独立的所以也是线程。并且有私聊的功能。
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * 创建客户端: 发送数据+接收数据
- * 写出数据:输出流
- * 读取数据:输入流
- *
- 输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立
- 加入名称
- */
- public class Client {
- public static void main(String[] args) throws UnknownHostException, IOException {
- System.out.println("请输入名称:");
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- String name = br.readLine();
- if(name.equals("")){
- return;
- }
- Socket client = new Socket("localhost",);
- new Thread(new Send(client,name)).start(); //一条路径
- new Thread(new Receive(client)).start(); //一条路径
- }
- }
- /**
- * 接收线程
- */
- public class Receive implements Runnable {
- //输入流
- private DataInputStream dis ;
- //线程标识
- private boolean isRunning = true;
- public Receive() {
- }
- public Receive(Socket client){
- try {
- dis = new DataInputStream(client.getInputStream());
- } catch (IOException e) {
- e.printStackTrace();
- isRunning =false;
- CloseUtil.closeAll(dis);
- }
- }
- /**
- * 接收数据
- */
- public String receive(){
- String msg ="";
- try {
- msg=dis.readUTF();
- } catch (IOException e) {
- e.printStackTrace();
- isRunning =false;
- CloseUtil.closeAll(dis);
- }
- return msg;
- }
- @Override
- public void run() {
- //线程体
- while(isRunning){
- System.out.println(receive());
- }
- }
- }
- /**
- * 发送数据 线程
- */
- public class Send implements Runnable{
- //控制台输入流
- private BufferedReader console;
- //管道输出流
- private DataOutputStream dos;
- //控制线程
- private boolean isRunning =true;
- //名称
- private String name;
- public Send() {
- console =new BufferedReader(new InputStreamReader(System.in));
- }
- public Send(Socket client,String name){
- this();
- try {
- dos =new DataOutputStream(client.getOutputStream());
- this.name =name;
- send(this.name);
- } catch (IOException e) {
- //e.printStackTrace();
- isRunning =false;
- CloseUtil.closeAll(dos,console);
- }
- }
- //1、从控制台接收数据
- private String getMsgFromConsole(){
- try {
- return console.readLine();
- } catch (IOException e) {
- //e.printStackTrace();
- }
- return "";
- }
- /**
- * 1、从控制台接收数据
- * 2、发送数据
- */
- public void send(String msg){
- try {
- if(null!=msg&& !msg.equals("")){
- dos.writeUTF(msg);
- dos.flush(); //强制刷新
- }
- } catch (IOException e) {
- //e.printStackTrace();
- isRunning =false;
- CloseUtil.closeAll(dos,console);
- }
- }
- @Override
- public void run() {
- //线程体
- while(isRunning){
- send(getMsgFromConsole());
- }
- }
- }
- /**
- * 创建服务器
- * 写出数据:输出流
- * 读取数据:输入流
- */
- public class Server {
- private List<MyChannel> all = new ArrayList<MyChannel>();
- public static void main(String[] args) throws IOException {
- new Server().start();
- }
- public void start() throws IOException{
- ServerSocket server =new ServerSocket();
- while(true){
- Socket client =server.accept();
- MyChannel channel = new MyChannel(client);
- all.add(channel);//统一管理
- new Thread(channel).start(); //一条道路
- }
- }
- /**
- * 一个客户端 一条道路
- * 1、输入流
- * 2、输出流
- * 3、接收数据
- * 4、发送数据
- */
- private class MyChannel implements Runnable{
- private DataInputStream dis ;
- private DataOutputStream dos ;
- private boolean isRunning =true;
- private String name;
- public MyChannel(Socket client ) {
- try {
- dis = new DataInputStream(client.getInputStream());
- dos = new DataOutputStream(client.getOutputStream());
- this.name =dis.readUTF();
- this.send("欢迎您进入聊天室");
- sendOthers(this.name+"进入了聊天室",true);
- } catch (IOException e) {
- //e.printStackTrace();
- CloseUtil.closeAll(dis,dos);
- isRunning =false;
- }
- }
- /**
- * 读取数据
- * @return
- */
- private String receive(){
- String msg ="";
- try {
- msg=dis.readUTF();
- } catch (IOException e) {
- //e.printStackTrace();
- CloseUtil.closeAll(dis);
- isRunning =false;
- all.remove(this); //移除自身
- }
- return msg;
- }
- /**
- * 发送数据
- */
- private void send(String msg){
- if(null==msg ||msg.equals("")){
- return ;
- }
- try {
- dos.writeUTF(msg);
- dos.flush();
- } catch (IOException e) {
- //e.printStackTrace();
- CloseUtil.closeAll(dos);
- isRunning =false;
- all.remove(this); //移除自身
- }
- }
- /**
- * 发送给其他客户端
- */
- private void sendOthers(String msg,boolean sys){
- //是否为私聊 约定
- if(msg.startsWith("@")&& msg.indexOf(":")>- ){ //私聊
- //获取name
- String name =msg.substring(,msg.indexOf(":"));
- String content = msg.substring(msg.indexOf(":")+);
- for(MyChannel other:all){
- if(other.name.equals(name)){
- other.send(this.name+"对您悄悄地说:"+content);
- }
- }
- }else{
- //遍历容器
- for(MyChannel other:all){
- if(other ==this){
- continue;
- }
- if(sys){ //系统信息
- other.send("系统信息:"+msg);
- }else{
- //发送其他客户端
- other.send(this.name+"对所有人说:"+msg);
- }
- }
- }
- }
- @Override
- public void run() {
- while(isRunning){
- sendOthers(receive(),false);
- }
- }
- }
- }
- /**
- * 关闭流的方法
- */
- public class CloseUtil {
- public static void closeAll(Closeable... io){
- for(Closeable temp:io){
- try {
- if (null != temp) {
- temp.close();
- }
- } catch (Exception e) {
- // TODO: handle exception
- }
- }
- }
- }
java19 先开服务器,再开客户端的更多相关文章
- 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?
转自:https://www.zhihu.com/question/20173592 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?
- [转]linux C/C++服务器后台开发面试题总结
linux C/C++服务器后台开发面试题总结 https://www.cnblogs.com/nancymake/p/6516933.html 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别 ...
- FTP服务器需要开几个端口
原文: https://blog.csdn.net/houbin0912/article/details/72578688 -------------------------------------- ...
- unity3D 锁屏再开程序崩溃
在Uniyt3d 调用Android Plugin 的时候,会出现锁屏后再开,程序就崩溃的的现象,解决办法就是在 AndroidManifest.xml 加入 android:configChang ...
- SPEC 2000 整形和浮点性能测试结果是各项基准程序得分的几何平均值,几何平均值是 n 个数连乘之 后再开 n 次根号
SPEC 2000 能够生成多种格式的测试结果报表,包括 asc,ps,raw,pdf,html 等格式,报 表所在目录为/home/sepc2000all/result. 整形和浮点性能测试结果是 ...
- windows 2008 server 服务器远程桌面连接会话自动注销,在服务器上开掉的软件全部自动关闭的解决办法
windows 2008 server 服务器远程桌面连接会话自动注销,在服务器上开掉的软件全部自动关闭的解决办法:
- 关了浏览器再开,怎么session还在?
关了浏览器session当然仍然存在,因为session是储存在服务器端的,而服务器是不可能知道你有没有关掉浏览器. 服务器只是简单的保持session接受用户请求,只有当session一段时间没有被 ...
- 使用CBrother做TCP服务器与C++客户端通信
使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...
随机推荐
- jav利用反射修改类的静态变量
有Student这个类: public class Student { private static String schoolName=""; private static St ...
- dojo 图表制作教程
http://www.sitepen.com/labs/code/charting/tutorial/tutorial1.html http://www.sitepen.com/labs/code/c ...
- URAL1009
链接 第一道URAL题 简单递推 #include <iostream> #include<cstdio> #include<cstring> #include&l ...
- Android 系统日期时间的获取
import java.text.SimpleDateFormat; SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月 ...
- Yet Another Scheme Introduction学习
Chapter 2 Function exact->inexact is to convert from fractional numbers to floating point numbers ...
- [liu yanling]测试用例的设计方法
一.功能测试 1.对话框测试输入进行测试.包括中文字符.英文字符.数字字符.特殊字符.及几种字符的组合. 2.对界面可操作按钮进行测试.包括[新增(N)][保存(S)][修改(M) ...
- Linux查看系统性能命令
性能调优的第一步是性能分析,下面从性能分析着手进行一些介绍,尤其对linux性能分析工具vmstat的用法和实践进行详细介绍. ———————————————————————————————————— ...
- html input设置为只读属性
有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input无效,及其value不会 ...
- c++ 派生类向基类转换的可访问性
对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...
- bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...