TCP程序设计(单线程服务器和多线程服务器学习)
2013-01-02 14:16
387 查看
/********下面是单线程服务器的服务器端*********/
package serverSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/***
* TCP程序设计:
* java中使用套接字完成TCP程序的开发,特点:可靠、双向、持续、点对点
* 对java的网络程序来说,每一个客户端都是一个socket对象;
* serverSocket编程服务器端:
* 注意:该为单线程服务器,即一个客户连接进入之后,其他客户只能在等待,连接不进去的.
* 注意:该种服务器设置,不适合聊天软件的开发,因为必须等待连接进入,会占用大量资源.
* @author Administrator
*
*/
public class EchoServer {
public static void main(String[] args) throws Exception{
ServerSocket server = null;
Socket client = null;
PrintStream out = null;
BufferedReader buf = null;
server = new ServerSocket(8888);
while(true){
System.out.println("服务器运行,等待客户连接中......");
client = server.accept();//排队等待客户端接入
buf = new BufferedReader(
new InputStreamReader(client.getInputStream()));
out = new PrintStream(client.getOutputStream());
boolean flag = true;
while(flag){
String str = buf.readLine();
if(str == null || "".equals(str)){
flag = false;
}else{
if("bye".equals(str)){
flag = false;
}else{
out.println("ECHO: " + str);
}
}
}
buf.close();
out.close();
client.close();
}
}
}
/********下面是单线程服务器的客户端*********/
package serverSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/***
* socket通信客户端:
* 关键:
* 1、input:控制台输入流,
* 2、out:向服务器输出流,
* 3、buf:读取返回信息流
* @author Administrator
*
*/
public class EchoClient {
public static void main(String[] args) throws Exception{
Socket client = null;
client = new Socket("localhost",8888);//连接编程,
BufferedReader buf = null;
PrintStream out = null;
BufferedReader input = null;
input = new BufferedReader(//输入流:接受从控制台输入的信息,
new InputStreamReader(System.in));
out = new PrintStream(client.getOutputStream());//输出流:打开向服务器输出的流
buf = new BufferedReader(//输入流:接受从服务器返回的信息,
new InputStreamReader(client.getInputStream()));
boolean flag = true;
while(flag){
System.out.println("输入信息: ");
String line = input.readLine();
out.println(line);
if("bye".equals(line)){
flag = false;
}else{
String echo = buf.readLine();//获取服务器返回信息,
System.out.println(echo);
}
}
client.close();
buf.close();
out.close();
input.close();
}
}
/********下面是多线程服务器测试*********/
package serverSocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/***
* 多线程服务器:
* 原理:每当接入一客户,就另起一线程,将回复信息的任务交给了线程处理,
* 注意:该种服务器设置,不适合聊天软件的开发,因为必须等待连接进入,会占用大量资源.
* @author Administrator
*
*/
public class EchoThreadServer {
public static void main(String[] args)throws Exception {
ServerSocket server = null;
Socket client = null;
server = new ServerSocket(8888);
boolean flag = true;
while(flag){
System.out.println("服务器正在运行,等待客户连接......");
client = server.accept();
new Thread(new EchoThread(client)).start();
//server.close();
}
}
}
/***
* 每一客户接入,都新创建一线程,打开输入流,输出流,处理信息
* @author Administrator
*
*/
class EchoThread implements Runnable{
private Socket client = null;
public EchoThread(Socket client) {
this.client = client;
}
@Override
public void run(){
PrintStream out = null;
BufferedReader buf = null;
try {
out = new PrintStream(client.getOutputStream());//打开输出流
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//打开输入流
boolean flag = true;
while(flag){
String line = buf.readLine();
if(line == null || "".equals(line)){
flag = false;
}else{
if("bye".equals(line)){
flag = false;
}else{
out.println("Echo: " + line);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
out.close();
buf.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
*******************************************************经测试通过,只为交流学习************************
package serverSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/***
* TCP程序设计:
* java中使用套接字完成TCP程序的开发,特点:可靠、双向、持续、点对点
* 对java的网络程序来说,每一个客户端都是一个socket对象;
* serverSocket编程服务器端:
* 注意:该为单线程服务器,即一个客户连接进入之后,其他客户只能在等待,连接不进去的.
* 注意:该种服务器设置,不适合聊天软件的开发,因为必须等待连接进入,会占用大量资源.
* @author Administrator
*
*/
public class EchoServer {
public static void main(String[] args) throws Exception{
ServerSocket server = null;
Socket client = null;
PrintStream out = null;
BufferedReader buf = null;
server = new ServerSocket(8888);
while(true){
System.out.println("服务器运行,等待客户连接中......");
client = server.accept();//排队等待客户端接入
buf = new BufferedReader(
new InputStreamReader(client.getInputStream()));
out = new PrintStream(client.getOutputStream());
boolean flag = true;
while(flag){
String str = buf.readLine();
if(str == null || "".equals(str)){
flag = false;
}else{
if("bye".equals(str)){
flag = false;
}else{
out.println("ECHO: " + str);
}
}
}
buf.close();
out.close();
client.close();
}
}
}
/********下面是单线程服务器的客户端*********/
package serverSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/***
* socket通信客户端:
* 关键:
* 1、input:控制台输入流,
* 2、out:向服务器输出流,
* 3、buf:读取返回信息流
* @author Administrator
*
*/
public class EchoClient {
public static void main(String[] args) throws Exception{
Socket client = null;
client = new Socket("localhost",8888);//连接编程,
BufferedReader buf = null;
PrintStream out = null;
BufferedReader input = null;
input = new BufferedReader(//输入流:接受从控制台输入的信息,
new InputStreamReader(System.in));
out = new PrintStream(client.getOutputStream());//输出流:打开向服务器输出的流
buf = new BufferedReader(//输入流:接受从服务器返回的信息,
new InputStreamReader(client.getInputStream()));
boolean flag = true;
while(flag){
System.out.println("输入信息: ");
String line = input.readLine();
out.println(line);
if("bye".equals(line)){
flag = false;
}else{
String echo = buf.readLine();//获取服务器返回信息,
System.out.println(echo);
}
}
client.close();
buf.close();
out.close();
input.close();
}
}
/********下面是多线程服务器测试*********/
package serverSocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/***
* 多线程服务器:
* 原理:每当接入一客户,就另起一线程,将回复信息的任务交给了线程处理,
* 注意:该种服务器设置,不适合聊天软件的开发,因为必须等待连接进入,会占用大量资源.
* @author Administrator
*
*/
public class EchoThreadServer {
public static void main(String[] args)throws Exception {
ServerSocket server = null;
Socket client = null;
server = new ServerSocket(8888);
boolean flag = true;
while(flag){
System.out.println("服务器正在运行,等待客户连接......");
client = server.accept();
new Thread(new EchoThread(client)).start();
//server.close();
}
}
}
/***
* 每一客户接入,都新创建一线程,打开输入流,输出流,处理信息
* @author Administrator
*
*/
class EchoThread implements Runnable{
private Socket client = null;
public EchoThread(Socket client) {
this.client = client;
}
@Override
public void run(){
PrintStream out = null;
BufferedReader buf = null;
try {
out = new PrintStream(client.getOutputStream());//打开输出流
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//打开输入流
boolean flag = true;
while(flag){
String line = buf.readLine();
if(line == null || "".equals(line)){
flag = false;
}else{
if("bye".equals(line)){
flag = false;
}else{
out.println("Echo: " + line);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
out.close();
buf.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
*******************************************************经测试通过,只为交流学习************************
相关文章推荐
- TCP程序设计(单线程服务器和多线程服务器学习)
- Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)
- Win 32 多线程程序设计学习笔记之五:终止线程
- Win 32 多线程程序设计学习笔记之二:线程
- 马士兵-多线程学习第03课 线程的合并,礼让和优先级
- java 网络流 TCP Socket和SeverSocket 上传文件(字节流)+ 服务器多线程
- 马士兵-多线程学习第04课 线程的同步
- [原]Java多线程编程学习笔记之一:线程中断(含代码)
- JAVA学习第二十四课(多线程(三))- 线程的同步
- 多线程编程学习3——使用MFC工作者线程
- java多线程学习之一——线程的状态、上下文切换和线程监控
- 多线程程序设计学习(5)balking模式和timed模式
- 学习TCP/IP客户端服务器的搭建
- 高性能、高并发TCP服务器(多线程调用libevent)
- 多线程基础学习第二篇(多个线程多把锁)
- 一个不错的线程讲解系列,记录下来以便学习(最近研究多线程以及并发)
- java多线程学习四:后台线程
- iOS多线程学习---控制线程通信及线程使用的总结
- iOS学习笔记-104.多线程03——线程间通信图片下载与时间计算
- 6.多线程学习--守护线程的创建和运行