JAVA的Socket编程
来源:互联网 发布:自动伴奏效果器软件 编辑:程序博客网 时间:2024/05/13 14:46
网络编程的简单理解
Java中的Socket编程
一个完整的例子
有了基本的模型和API,我们可以做一个简单的Socket例子了。
服务端:
import Java.io.*;
import Java.net.*;
public class MyServer {
}
客户端:
import Java.net.*;
import Java.io.*;
public class Client{
}
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识.
这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器也会使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:
服务器:
- import java.io.*;
- import java.net.*;
- public class MyServer {
- public static void main(String[] args) throws IOException{
- ServerSocket server=new ServerSocket(5678);
- while(true){
- Socket client=server.accept();
- BufferedReader in=
- new BufferedReader(new InputStreamReader(client.getInputStream()));
- PrintWriter out=new PrintWriter(client.getOutputStream());
- while(true){
- String str=in.readLine();
- System.out.println(str);
- out.println("has receive....");
- out.flush();
- if(str.equals("end"))
- break;
- }
- client.close();
- }
- }
- }
这里仅仅只是加了一个外层的While循环.这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了.所以线程是最好的解决方案.
那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系.然后由线程来执行刚才的操作.要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法.而run方法所做的事情.就是刚才单线程版本main所做的事情.因此我们的程序变成了这样:
- import java.net.*;
- import java.io.*;
- public class MultiUser extends Thread{
- private Socket client;
- public MultiUser(Socket c){
- this.client=c;
- }
- public void run(){
- try{
- BufferedReader in=
- new BufferedReader(new InputStreamReader(client.getInputStream()));
- PrintWriter out=new PrintWriter(client.getOutputStream());
- //Mutil User but can't parallel
- while(true){
- String str=in.readLine();
- System.out.println(str);
- out.println("has receive....");
- out.flush();
- if(str.equals("end"))
- break;
- }
- client.close();
- }catch(IOException ex){
- }finally{
- }
- }
- public static void main(String[] args)throws IOException{
- ServerSocket server=new ServerSocket(5678);
- while(true){
- //transfer location change Single User or Multi User
- MultiUser mu=new MultiUser(server.accept());
- mu.start();
- }
- }
- }
我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系.这样每个线程就有了.一个通讯管道.同样我们可以填写run方法.把之前的操作交给线程来完成.这样多客户并行的Socket就建立起来了.
服务器基本步骤:
1.指定端口实例化一个SeverSocket
2.调用ServerSocket的accept()方法,以在等待连接期间造成阻塞
3.获取位于该底层的Socket的流以进行读写操作
4.将数据封装成流
5.对Socket进行读写
6.关闭打开的流
客户端基本步骤:
1.通过IP地址和端口实例化Socket,请求连接服务器
2.获得Socket上的流以进行读写
3.把流封装进BufferedReader/PrintWriter的实例
4.对Socket进行读写
5.关闭打开的流
- java的Socket编程
- Java的Socket编程
- java的socket编程
- Java的socket编程
- JAVA的Socket编程
- Java的Socket编程
- java的socket编程
- Java的Socket编程
- Java的socket编程
- Java的Socket编程
- Java语言的Socket编程
- Java语言的Socket编程
- Java语言的Socket编程
- Java语言的Socket编程
- Java语言的Socket编程
- Java的Socket编程总结
- java 的socket网络编程
- java的socket网络编程
- KM算法
- 2014Esri全球用户大会之3D
- VC中ComboBox使用详解
- 哈佛图书馆墙上的训言
- HEVC ME之 H.264论文综述与代码实现
- JAVA的Socket编程
- 用u盘和iso镜像文件装win8.1系统
- Know the HEVC Standard
- linux--watch命令使用
- Windows问题集
- HDUJ 2032 杨辉三角
- 求多个字符串相同的且最前面的子字符串(该字符串长度>=3)【用递归进行判断】
- 没智能手机会死星人的福音来了
- apache和nginx原理上的不同之处