服务端的实现
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程序的更多相关文章
-
7.3(java学习笔记)网络编程之UDP
一.UDP UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议, 传输数据时发送方和接收方无需建立连接,所以是不安全的. 发送时不建立连接直接 ...
-
java 26 - 8 网络编程之 TCP协议上传图片
上次的是上传TXT文件,这次上传的是图片.同样,上传成功需要反馈给客户端. 区别: TXT文件用记事本打开,我们可以看得懂,所以用了缓冲字符流,对通道内的字节流进行包装了. 而图片用记事本打开,我们看 ...
-
java 26 - 6 网络编程之 TCP协议 传输思路 以及 代码
TCP传输 Socket和ServerSocket 建立客户端和服务器 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器是两个独立的应用程序 TCP协议发送 ...
-
java 26 - 9 网络编程之 TCP协议多用户上传文件
TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...
-
java 26 - 8 网络编程之 TCP协议的练习
TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...
-
java 25 - 4 网络编程之 UDP协议传输思路
UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...
-
java 25 - 3 网络编程之 Socket套接字
Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...
-
java 26 - 7 网络编程之 TCP协议代码优化
上次所写的代码中,客户端和服务器端所进行的数据传输所用的是字节流. 优化: A:这次,为了高效,对这个字节流通过转换流来进行包装,包装成高效字符流. B:这次,传输的数据是通过键盘录入的数据. 服务器 ...
-
java 25 - 4 网络编程之 UDP协议传输的代码优化
UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...
随机推荐
-
[LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
-
mongdb查询与排序
db.QResult.find({'CreateDate':{'$gte' : ISODate('2016-07-01'), '$lte' : ISODate('2016-08-01')}}).sor ...
-
Linux下tomcat部署
进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 如果你想直接干掉Tomcat,你可以使用kill命令,直接杀死Tomcat进程 kill -9 7010 然后继续查看 ...
-
从 Java 代码逆向工程生成 UML 类图和序列图
from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Sof ...
-
Object-C 新手教程
大纲 開始吧 下载这篇教学 设定环境 前言 编译 hello world 创建 Classes @interface @implementation 把它们凑在一起 具体说明... 多重參数 建构子( ...
-
ES6入门2
for-of循环: 新语法如下: for (var value of myArray) { console.log(value); } 它的优点是: 这是目前遍历数组最简洁和直接的语法: 它避免了fo ...
-
c++智能指针和二叉树(1): 图解层序遍历和逐层打印二叉树
二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不胜数. 然而大多数文章都是讲解的前序/中序/后序遍历,有关逐层打印元素的文章并不多,已有文章的讲解也较为晦涩读起来不得要领.本文将用形象的 ...
-
centos7设置httpd
1.httpd开机自启动 systemctl enable httpd.service 2.httpd开机不自启动 systemctl disable httpd.service 3.启动httpd ...
-
endnote中文格式“,等”的修改
https://www.howsci.com/endnote-eng-cn-refer-etal.html
-
如何在Linux系统中安装VMware
首先打开vmware官网的下载链接:https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_works ...