事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.

Java代码  
  1. ServerSocket server=new ServerSocket(6789);
ServerSocket server=new ServerSocket(6789);

这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.

Java代码  
  1. Socket client=new Socket(InetAddress.getLocalHost(),5678);
Socket client=new Socket(InetAddress.getLocalHost(),5678);

客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.

Java代码  
  1. BufferedReader in=
  2. new BufferedReader(new InputStreamReader(server.getInputStream()));
  3. PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader in=
new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream()); 

上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Socket的两个方法.getInputStream()和getOutputStream()方.分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程了.
服务方:

Java代码  
  1. import java.io.*;
  2. import java.net.*;
  3. public class MyServer {
  4. public static void main(String[] args) throws IOException{
  5. ServerSocket server=new ServerSocket(5678);
  6. Socket client=server.accept();
  7. BufferedReader in=
  8. new BufferedReader(new InputStreamReader(client.getInputStream()));
  9. PrintWriter out=new PrintWriter(client.getOutputStream());
  10. while(true){
  11. String str=in.readLine();
  12. System.out.println(str);
  13. out.println("has receive....");
  14. out.flush();
  15. if(str.equals("end"))
  16. break;
  17. }
  18. client.close();
  19. }
  20. }
import java.io.*;
import java.net.*; public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(5678);
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();
}
} 

这个程序的主要目的在于服务器不断接收客户机所写入的信息只到.客户机发送"End"字符串就退出程序.并且服务器也会做出"Receive"为回应.告知客户机已接收到消息.

客户机代码:

Java代码  
  1. import java.net.*;
  2. import java.io.*;
  3. public class Client{
  4. static Socket server;
  5. public static void main(String[] args)throws Exception{
  6. server=new Socket(InetAddress.getLocalHost(),5678);
  7. BufferedReader in=
  8. new BufferedReader(new InputStreamReader(server.getInputStream()));
  9. PrintWriter out=new PrintWriter(server.getOutputStream());
  10. BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
  11. while(true){
  12. String str=wt.readLine();
  13. out.println(str);
  14. out.flush();
  15. if(str.equals("end")){
  16. break;
  17. }
  18. System.out.println(in.readLine());
  19. }
  20. server.close();
  21. }
  22. }
import java.net.*;
import java.io.*; public class Client{
static Socket server; public static void main(String[] args)throws Exception{
server=new Socket(InetAddress.getLocalHost(),5678);
BufferedReader in=
new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); while(true){
String str=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end")){
break;
}
System.out.println(in.readLine());
}
server.close();
}
} 

客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识.

这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器也会使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:

服务器:

Java代码  
  1. import java.io.*;
  2. import java.net.*;
  3. public class MyServer {
  4. public static void main(String[] args) throws IOException{
  5. ServerSocket server=new ServerSocket(5678);
  6. while(true){
  7. Socket client=server.accept();
  8. BufferedReader in=
  9. new BufferedReader(new InputStreamReader(client.getInputStream()));
  10. PrintWriter out=new PrintWriter(client.getOutputStream());
  11. while(true){
  12. String str=in.readLine();
  13. System.out.println(str);
  14. out.println("has receive....");
  15. out.flush();
  16. if(str.equals("end"))
  17. break;
  18. }
  19. client.close();
  20. }
  21. }
  22. }
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所做的事情.因此我们的程序变成了这样:

Java代码  
  1. import java.net.*;
  2. import java.io.*;
  3. public class MultiUser extends Thread{
  4. private Socket client;
  5. public MultiUser(Socket c){
  6. this.client=c;
  7. }
  8. public void run(){
  9. try{
  10. BufferedReader in=
  11. new BufferedReader(new InputStreamReader(client.getInputStream()));
  12. PrintWriter out=new PrintWriter(client.getOutputStream());
  13. //Mutil User but can't parallel
  14. while(true){
  15. String str=in.readLine();
  16. System.out.println(str);
  17. out.println("has receive....");
  18. out.flush();
  19. if(str.equals("end"))
  20. break;
  21. }
  22. client.close();
  23. }catch(IOException ex){
  24. }finally{
  25. }
  26. }
  27. public static void main(String[] args)throws IOException{
  28. ServerSocket server=new ServerSocket(5678);
  29. while(true){
  30. //transfer location change Single User or Multi User
  31. MultiUser mu=new MultiUser(server.accept());
  32. mu.start();
  33. }
  34. }
  35. }
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就建立起来了.

转载于:https://www.cnblogs.com/chenying99/archive/2012/06/14/2549101.html

JAVA socket编程实例 转载相关推荐

  1. tcp java实例_实现了基于TCP的Java Socket编程实例代码

    实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello" ...

  2. JAVA socket编程实例

    2019独角兽企业重金招聘Python工程师标准>>> 事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的 ...

  3. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络 ...

  4. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  5. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  6. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  7. JAVA socket编程 Datagram套接字 UDP协议(转)

      查看文章     JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...

  8. Java Socket编程----通信是这样炼成的

    转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...

  9. Socket编程实例

    2019独角兽企业重金招聘Python工程师标准>>> Java具有非常强大的网络应用开发能力.学习网络编程,估计都是从编写一个socket通信开始,从中慢慢掌握网络编程的一点点知识 ...

最新文章

  1. try catch 之后是否会继续执行
  2. 玖富(NASDAQ:JFU) :2019年Q4机构资金占比增至79.8%,科技赋能业务成果显著
  3. 装饰者模式的应用场景
  4. 西门子rwd68温控器说明书_西门子RWD68说明书
  5. 宝塔:ShopXO开源商城(如何二级域名访问)- 配置篇
  6. LAMP YUM安装配置实战
  7. 运动会管理系统java
  8. QT中widget相关控件
  9. C# 如何将Excel表格复制到Word中并保留格式
  10. SPI读写串行FLASH(W25Q64)
  11. 为什么三棱锥体积是三棱柱的三分之一?
  12. 希捷硬盘保修时间查询
  13. python 多线程 代理 爬取 豆果美食app
  14. 中国卸扣市场趋势报告、技术动态创新及市场预测
  15. 点微同城小程序配置教程及提交审核包过审经验分享
  16. CCU ETL脚本列表
  17. 简单易懂的人工智能系列:关联规则
  18. Newcoder Wannafly13 B Jxy军训(费马小定理、分数在模意义下的值)
  19. 你没有权限查看或编辑这个对象的权限设置 的解决方法
  20. 计算机专业qs国内大学,qs计算机专业大学排名

热门文章

  1. 【shell】docker images 拿到ID
  2. git-fork下来的项目(拷贝到本地 根据原来的库更新)
  3. Knn算法(机器学习)入门(Python实现)
  4. linux cat 脚本,Linux Shell 脚本攻略 读书笔记 -- 201.cat的几种用法
  5. Protobuf 安装及 Python、C# 示例
  6. C#学习之Reflection
  7. 如何实现linux+windows双系统启动
  8. Visual Studio 智能提示功能消失解决办法
  9. 最简洁粗暴版的虚拟用户配置FTP
  10. 转:图解C#的值类型,引用类型,栈,堆,ref,out