服务端的实现

 package com.gh.echo;
import java.io.*;
import java.net.*;
/**
* echo服务器程序
* 实现 不断接收字符串 ,然后返回一个echo+字符串
* 服务程序写成多线程
* @author ganhang
*
*/
public class EchoServerDemo {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8000);
System.out.println("服务器已启动。");
int i=1;
while (true) {
System.out.println("服务器正在等待连接...");
Socket s = ss.accept();
new Thread(new UserThread(s),"用户"+i++).start();//来一个用户启动一个线程
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 用户线程
* @author ganhang
*/
class UserThread implements Runnable{
private Socket s;
public UserThread(Socket s) {
this.s=s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-已连接");
try{
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
while(true){//循环读入知道读入bye
String info=br.readLine();//因为是读一行所以客服端发送过来的字符串必须有"\n"换行符
System.out.println(info);
if("".equals(info)||"bye".equals(info)){
break;
}else{
bw.write("echo:你好"+Thread.currentThread().getName()+"\n");//客服端用的读一行所以这边末尾加换行符
bw.flush();//缓存流必须刷新
}
}
br.close();
bw.close();
}catch(IOException e){
e.printStackTrace();
}
} }

客户端的实现

 package com.gh.echo;

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* echo客户端
* 实现从控制台写字符串发送给服务器,接收服务器发回来的字符串
* @author ganhang
*
*/
public class EchoClientDemo { public static void main(String[] args) {
try {
Socket sk=new Socket("",8000);
System.out.println("与服务器连接成功。");
Scanner sc=new Scanner(System.in);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream()));
while(true){
System.out.println("请输入文字:");
String info=sc.next();
if("bye".equals(info)){
break;
}else{
bw.write(info+"\n");
bw.flush();
System.out.println(br.readLine());
}
}
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
} }
}

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. c 结构体struct

    struct 定义初始化 #include<stdio.h> typedef struct stuInfo { ]; //姓名 int stuId; //学号 int age; //年龄 ...

  2. Matlab常用小技巧及部分快捷键

    Matlab常用小技巧一: 1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚.不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成.原因是 ...

  3. HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...

  4. BZOJ 1452: [JSOI2009]Count(二维BIT)

    为每一个权值开一个二维树状数组. ------------------------------------------------------------------------- #include& ...

  5. Struts学习之集成Ajax

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38782213 一,引题 1,Json数据格式简介 JSON是脱离语言的理想的数据交换格 ...

  6. 帝国cms语句调用

    帝国cms系统,灵动标签,有着非常强大的数据调用功能.这里为广大菜鸟站长普及一下. 我们来看这段代码. [e:loop={,,}] <li>·<a target="_bla ...

  7. js获取中英文长度

    function getLength(str) {    var len = str.length;    var reLen = 0;    for (var i = 0; i < len; ...

  8. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  9. 如何使用robots不让百度和google收录

    如何使用robots不让百度和google收录   有没有想过,如果我们某个站点不让百度和google收录,那怎么办? 搜索引擎已经和我们达成一个约定,如果我们按约定那样做了,它们就不要收录. 这个写 ...

  10. 基于Visual C++2013拆解世界五百强面试题--题11-查找数字出现次数

    在排序数组中,找出给定数字出现的次数比如{ 1, 2, 2, 2, 3}中2的出现次数是3次 我们可使用二分查找发,分别查找出2最先出现的位置和最后出现的位置相减即可. 下面是上代码: #includ ...