服务端的实现

  1. package com.gh.echo;
  2. import java.io.*;
  3. import java.net.*;
  4. /**
  5. * echo服务器程序
  6. * 实现 不断接收字符串 ,然后返回一个echo+字符串
  7. * 服务程序写成多线程
  8. * @author ganhang
  9. *
  10. */
  11. public class EchoServerDemo {
  12. public static void main(String[] args) {
  13. try {
  14. ServerSocket ss = new ServerSocket(8000);
  15. System.out.println("服务器已启动。");
  16. int i=1;
  17. while (true) {
  18. System.out.println("服务器正在等待连接...");
  19. Socket s = ss.accept();
  20. new Thread(new UserThread(s),"用户"+i++).start();//来一个用户启动一个线程
  21. }
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
  27. /**
  28. * 用户线程
  29. * @author ganhang
  30. */
  31. class UserThread implements Runnable{
  32. private Socket s;
  33. public UserThread(Socket s) {
  34. this.s=s;
  35. }
  36. @Override
  37. public void run() {
  38. System.out.println(Thread.currentThread().getName()+"-已连接");
  39. try{
  40. BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
  41. BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  42. while(true){//循环读入知道读入bye
  43. String info=br.readLine();//因为是读一行所以客服端发送过来的字符串必须有"\n"换行符
  44. System.out.println(info);
  45. if("".equals(info)||"bye".equals(info)){
  46. break;
  47. }else{
  48. bw.write("echo:你好"+Thread.currentThread().getName()+"\n");//客服端用的读一行所以这边末尾加换行符
  49. bw.flush();//缓存流必须刷新
  50. }
  51. }
  52. br.close();
  53. bw.close();
  54. }catch(IOException e){
  55. e.printStackTrace();
  56. }
  57. }
  58.  
  59. }

客户端的实现

  1. package com.gh.echo;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStreamWriter;
  8. import java.net.Socket;
  9. import java.util.Scanner;
  10. /**
  11. * echo客户端
  12. * 实现从控制台写字符串发送给服务器,接收服务器发回来的字符串
  13. * @author ganhang
  14. *
  15. */
  16. public class EchoClientDemo {
  17.  
  18. public static void main(String[] args) {
  19. try {
  20. Socket sk=new Socket("",8000);
  21. System.out.println("与服务器连接成功。");
  22. Scanner sc=new Scanner(System.in);
  23. BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
  24. BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream()));
  25. while(true){
  26. System.out.println("请输入文字:");
  27. String info=sc.next();
  28. if("bye".equals(info)){
  29. break;
  30. }else{
  31. bw.write(info+"\n");
  32. bw.flush();
  33. System.out.println(br.readLine());
  34. }
  35. }
  36. bw.close();
  37. br.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41.  
  42. }
  43. }

java学习之网络编程之echo程序的更多相关文章

  1. 7.3(java学习笔记)网络编程之UDP

    一.UDP UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议, 传输数据时发送方和接收方无需建立连接,所以是不安全的. 发送时不建立连接直接 ...

  2. java 26 - 8 网络编程之 TCP协议上传图片

    上次的是上传TXT文件,这次上传的是图片.同样,上传成功需要反馈给客户端. 区别: TXT文件用记事本打开,我们可以看得懂,所以用了缓冲字符流,对通道内的字节流进行包装了. 而图片用记事本打开,我们看 ...

  3. java 26 - 6 网络编程之 TCP协议 传输思路 以及 代码

    TCP传输 Socket和ServerSocket 建立客户端和服务器 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器是两个独立的应用程序 TCP协议发送 ...

  4. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

  5. java 26 - 8 网络编程之 TCP协议的练习

    TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...

  6. java 25 - 4 网络编程之 UDP协议传输思路

    UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...

  7. java 25 - 3 网络编程之 Socket套接字

    Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...

  8. java 26 - 7 网络编程之 TCP协议代码优化

    上次所写的代码中,客户端和服务器端所进行的数据传输所用的是字节流. 优化: A:这次,为了高效,对这个字节流通过转换流来进行包装,包装成高效字符流. B:这次,传输的数据是通过键盘录入的数据. 服务器 ...

  9. java 25 - 4 网络编程之 UDP协议传输的代码优化

    UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...

随机推荐

  1. poj 2480 (欧拉函数应用)

    点击打开链接 //求SUM(gcd(i,n), 1<=i<=n) /* g(n)=gcd(i,n),根据积性定义g(mn)=g(m)*g(n)(gcd(m,n)==1) 所以gcd(i,n ...

  2. JAVA处理XML

    <xml>  <ToUserName><![CDATA[toUser]]></ToUserName>  <FromUserName>< ...

  3. Filter 字符编码Filter 一

    使用字符编码Filter package com.helloweenvsfei.filter; import java.io.IOException; import javax.servlet.Fil ...

  4. c++ primer plus 习题答案(6)

    p425.1 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; ...

  5. MVC数据提交

    关于请求方式(form表单) .form的几个属性 <form name="input" action="http://www.baidu.com" me ...

  6. servlet三种实现方式之三通过继承HttpServlet开发servlet

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第三种: import java.io.*; i ...

  7. 【LeetCode题意分析&解答】33. Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. Protel99se教程七:创建PCB元件封装

    在上一节课当中,我们给大家讲解了如何制作SCH原理图的元件库,这一节课,我们给大家讲解的是如何制作protel99se封装,在我们制作好元件好,需要制作对应的封装库,以供PCB设计所用. 第一步:进入 ...

  9. oracle命令大全

    内容包括三大项:    1.oracle基本操作语句 2.SQLServer基本操作语句 3.各种数据库连接方法 ******************************************* ...

  10. HDU 2147 kiki's game

    题解:画图可得当横纵坐标均为奇数时为必败态…… #include <cstdio> int main(){ int a,b; while(scanf("%d%d",&a ...