1. 先开服务器,再开客户端。
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. /**
  9. * 创建服务器
  10. * 写出数据:输出流
  11. * 读取数据:输入流
  12. */
  13. public class Server {
  14. public static void main(String[] args) throws IOException {
  15. ServerSocket server =new ServerSocket();
  16. Socket client =server.accept();
  17. //写出数据
  18. //输入流
  19. DataInputStream dis = new DataInputStream(client.getInputStream());
  20. String msg =dis.readUTF();
  21. //输出流
  22. DataOutputStream dos = new DataOutputStream(client.getOutputStream());
  23. dos.writeUTF("服务器-->"+msg);
  24. dos.flush();
  25. }
  26. }
  27.  
  28. import java.io.BufferedReader;
  29. import java.io.DataInputStream;
  30. import java.io.DataOutputStream;
  31. import java.io.IOException;
  32. import java.io.InputStreamReader;
  33. import java.net.Socket;
  34. import java.net.UnknownHostException;
  35. /**
  36. * 创建客户端: 发送数据+接收数据
  37. * 写出数据:输出流
  38. * 读取数据:输入流
  39. */
  40. public class Client {
  41. public static void main(String[] args) throws UnknownHostException, IOException {
  42. Socket client = new Socket("localhost",);
  43. //把控制台输入封装成输入流
  44. BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
  45. DataOutputStream dos = new DataOutputStream(client.getOutputStream());
  46. DataInputStream dis = new DataInputStream(client.getInputStream());
  47. while(true){
  48. String info =console.readLine();//根据输入的换行符读取一行。
  49. //输出流,输出去在读进来。
  50. dos.writeUTF(info);
  51. dos.flush();
  52. //输入流
  53. String msg =dis.readUTF();
  54. System.out.println(msg);
  55. }
  56. }
  57. }
  58.  
  59. 聊天室:
  60. . 客户端可以发送数据 +接收数据 独立的
  61. . 每个客户端创建一个线程,彼此相互独立。
  62.  
  63. 输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立。
  64.  
  65. a客户端发送数据给服务器,服务器中转给bc客户端。所以服务器要为每一个客户端建立一个线程。服务器为每一个客户端服务时,每个客户端都有输入流和输出流,客户端的输入流和输出流也是独立的所以也是线程。并且有私聊的功能。
  66.  
  67. import java.io.BufferedReader;
  68. import java.io.IOException;
  69. import java.io.InputStreamReader;
  70. import java.net.Socket;
  71. import java.net.UnknownHostException;
  72.  
  73. /**
  74. * 创建客户端: 发送数据+接收数据
  75. * 写出数据:输出流
  76. * 读取数据:输入流
  77. *
  78. 输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立
  79.  
  80. 加入名称
  81. */
  82. public class Client {
  83. public static void main(String[] args) throws UnknownHostException, IOException {
  84. System.out.println("请输入名称:");
  85. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  86. String name = br.readLine();
  87. if(name.equals("")){
  88. return;
  89. }
  90. Socket client = new Socket("localhost",);
  91. new Thread(new Send(client,name)).start(); //一条路径
  92. new Thread(new Receive(client)).start(); //一条路径
  93. }
  94. }
  95.  
  96. /**
  97. * 接收线程
  98. */
  99. public class Receive implements Runnable {
  100. //输入流
  101. private DataInputStream dis ;
  102. //线程标识
  103. private boolean isRunning = true;
  104. public Receive() {
  105. }
  106. public Receive(Socket client){
  107. try {
  108. dis = new DataInputStream(client.getInputStream());
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. isRunning =false;
  112. CloseUtil.closeAll(dis);
  113. }
  114. }
  115. /**
  116. * 接收数据
  117. */
  118. public String receive(){
  119. String msg ="";
  120. try {
  121. msg=dis.readUTF();
  122. } catch (IOException e) {
  123. e.printStackTrace();
  124. isRunning =false;
  125. CloseUtil.closeAll(dis);
  126. }
  127. return msg;
  128. }
  129. @Override
  130. public void run() {
  131. //线程体
  132. while(isRunning){
  133. System.out.println(receive());
  134. }
  135. }
  136. }
  137.  
  138. /**
  139. * 发送数据 线程
  140. */
  141. public class Send implements Runnable{
  142. //控制台输入流
  143. private BufferedReader console;
  144. //管道输出流
  145. private DataOutputStream dos;
  146. //控制线程
  147. private boolean isRunning =true;
  148. //名称
  149. private String name;
  150. public Send() {
  151. console =new BufferedReader(new InputStreamReader(System.in));
  152. }
  153. public Send(Socket client,String name){
  154. this();
  155. try {
  156. dos =new DataOutputStream(client.getOutputStream());
  157. this.name =name;
  158. send(this.name);
  159. } catch (IOException e) {
  160. //e.printStackTrace();
  161. isRunning =false;
  162. CloseUtil.closeAll(dos,console);
  163.  
  164. }
  165. }
  166. //1、从控制台接收数据
  167. private String getMsgFromConsole(){
  168. try {
  169. return console.readLine();
  170. } catch (IOException e) {
  171. //e.printStackTrace();
  172. }
  173. return "";
  174. }
  175. /**
  176. * 1、从控制台接收数据
  177. * 2、发送数据
  178. */
  179. public void send(String msg){
  180. try {
  181. if(null!=msg&& !msg.equals("")){
  182. dos.writeUTF(msg);
  183. dos.flush(); //强制刷新
  184. }
  185. } catch (IOException e) {
  186. //e.printStackTrace();
  187. isRunning =false;
  188. CloseUtil.closeAll(dos,console);
  189. }
  190. }
  191.  
  192. @Override
  193. public void run() {
  194. //线程体
  195. while(isRunning){
  196. send(getMsgFromConsole());
  197. }
  198. }
  199.  
  200. }
  201.  
  202. /**
  203. * 创建服务器
  204. * 写出数据:输出流
  205. * 读取数据:输入流
  206. */
  207. public class Server {
  208. private List<MyChannel> all = new ArrayList<MyChannel>();
  209.  
  210. public static void main(String[] args) throws IOException {
  211. new Server().start();
  212.  
  213. }
  214.  
  215. public void start() throws IOException{
  216. ServerSocket server =new ServerSocket();
  217. while(true){
  218. Socket client =server.accept();
  219. MyChannel channel = new MyChannel(client);
  220. all.add(channel);//统一管理
  221. new Thread(channel).start(); //一条道路
  222. }
  223. }
  224.  
  225. /**
  226. * 一个客户端 一条道路
  227. * 1、输入流
  228. * 2、输出流
  229. * 3、接收数据
  230. * 4、发送数据
  231. */
  232. private class MyChannel implements Runnable{
  233. private DataInputStream dis ;
  234. private DataOutputStream dos ;
  235. private boolean isRunning =true;
  236. private String name;
  237. public MyChannel(Socket client ) {
  238. try {
  239. dis = new DataInputStream(client.getInputStream());
  240. dos = new DataOutputStream(client.getOutputStream());
  241. this.name =dis.readUTF();
  242. this.send("欢迎您进入聊天室");
  243. sendOthers(this.name+"进入了聊天室",true);
  244. } catch (IOException e) {
  245. //e.printStackTrace();
  246. CloseUtil.closeAll(dis,dos);
  247. isRunning =false;
  248. }
  249. }
  250. /**
  251. * 读取数据
  252. * @return
  253. */
  254. private String receive(){
  255. String msg ="";
  256. try {
  257. msg=dis.readUTF();
  258. } catch (IOException e) {
  259. //e.printStackTrace();
  260. CloseUtil.closeAll(dis);
  261. isRunning =false;
  262. all.remove(this); //移除自身
  263. }
  264. return msg;
  265. }
  266.  
  267. /**
  268. * 发送数据
  269. */
  270. private void send(String msg){
  271. if(null==msg ||msg.equals("")){
  272. return ;
  273. }
  274. try {
  275. dos.writeUTF(msg);
  276. dos.flush();
  277. } catch (IOException e) {
  278. //e.printStackTrace();
  279. CloseUtil.closeAll(dos);
  280. isRunning =false;
  281. all.remove(this); //移除自身
  282. }
  283. }
  284.  
  285. /**
  286. * 发送给其他客户端
  287. */
  288. private void sendOthers(String msg,boolean sys){
  289. //是否为私聊 约定
  290. if(msg.startsWith("@")&& msg.indexOf(":")>- ){ //私聊
  291. //获取name
  292. String name =msg.substring(,msg.indexOf(":"));
  293. String content = msg.substring(msg.indexOf(":")+);
  294. for(MyChannel other:all){
  295. if(other.name.equals(name)){
  296. other.send(this.name+"对您悄悄地说:"+content);
  297. }
  298. }
  299. }else{
  300. //遍历容器
  301. for(MyChannel other:all){
  302. if(other ==this){
  303. continue;
  304. }
  305. if(sys){ //系统信息
  306. other.send("系统信息:"+msg);
  307. }else{
  308. //发送其他客户端
  309. other.send(this.name+"对所有人说:"+msg);
  310. }
  311. }
  312. }
  313. }
  314.  
  315. @Override
  316. public void run() {
  317. while(isRunning){
  318. sendOthers(receive(),false);
  319. }
  320. }
  321. }
  322.  
  323. }
  324.  
  325. /**
  326. * 关闭流的方法
  327. */
  328. public class CloseUtil {
  329. public static void closeAll(Closeable... io){
  330. for(Closeable temp:io){
  331. try {
  332. if (null != temp) {
  333. temp.close();
  334. }
  335. } catch (Exception e) {
  336. // TODO: handle exception
  337. }
  338. }
  339. }
  340. }

java19 先开服务器,再开客户端的更多相关文章

  1. 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?

    转自:https://www.zhihu.com/question/20173592 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?

  2. [转]linux C/C++服务器后台开发面试题总结

    linux C/C++服务器后台开发面试题总结  https://www.cnblogs.com/nancymake/p/6516933.html 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别 ...

  3. FTP服务器需要开几个端口

    原文: https://blog.csdn.net/houbin0912/article/details/72578688 -------------------------------------- ...

  4. unity3D 锁屏再开程序崩溃

    在Uniyt3d 调用Android Plugin 的时候,会出现锁屏后再开,程序就崩溃的的现象,解决办法就是在 AndroidManifest.xml 加入  android:configChang ...

  5. SPEC 2000 整形和浮点性能测试结果是各项基准程序得分的几何平均值,几何平均值是 n 个数连乘之 后再开 n 次根号

    SPEC 2000 能够生成多种格式的测试结果报表,包括 asc,ps,raw,pdf,html 等格式,报 表所在目录为/home/sepc2000­all/result. 整形和浮点性能测试结果是 ...

  6. windows 2008 server 服务器远程桌面连接会话自动注销,在服务器上开掉的软件全部自动关闭的解决办法

    windows 2008 server 服务器远程桌面连接会话自动注销,在服务器上开掉的软件全部自动关闭的解决办法:

  7. 关了浏览器再开,怎么session还在?

    关了浏览器session当然仍然存在,因为session是储存在服务器端的,而服务器是不可能知道你有没有关掉浏览器. 服务器只是简单的保持session接受用户请求,只有当session一段时间没有被 ...

  8. 使用CBrother做TCP服务器与C++客户端通信

    使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...

  9. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

随机推荐

  1. jav利用反射修改类的静态变量

    有Student这个类: public class Student { private static String schoolName=""; private static St ...

  2. dojo 图表制作教程

    http://www.sitepen.com/labs/code/charting/tutorial/tutorial1.html http://www.sitepen.com/labs/code/c ...

  3. URAL1009

    链接 第一道URAL题 简单递推 #include <iostream> #include<cstdio> #include<cstring> #include&l ...

  4. Android 系统日期时间的获取

    import java.text.SimpleDateFormat; SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月 ...

  5. Yet Another Scheme Introduction学习

    Chapter 2 Function exact->inexact is to convert from fractional numbers to floating point numbers ...

  6. [liu yanling]测试用例的设计方法

    一.功能测试      1.对话框测试输入进行测试.包括中文字符.英文字符.数字字符.特殊字符.及几种字符的组合.      2.对界面可操作按钮进行测试.包括[新增(N)][保存(S)][修改(M) ...

  7. Linux查看系统性能命令

    性能调优的第一步是性能分析,下面从性能分析着手进行一些介绍,尤其对linux性能分析工具vmstat的用法和实践进行详细介绍. ———————————————————————————————————— ...

  8. html input设置为只读属性

    有两种方式可以实现input的只读效果:disabled 和 readonly. 自然两种出来的效果都是只能读取不能编辑,可是两者有很大不同. Disabled说明该input无效,及其value不会 ...

  9. c++ 派生类向基类转换的可访问性

    对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...

  10. bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...