8月2日----TCP Socket 编程
2015-08-04 21:15
585 查看
TCP编程基础
TCP是基于Socket类编写的通信程序。InetAddress类
InetAddress类是与IP地址相关的类,利用该类可以获取IP地址,主机地址等信息,常用的方法如下:
getAddress()
返回此 InetAddress 对象的原始 IP 地址。
getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
getHostName()
获取此 IP 地址的主机名。
getLocalHost()
返回本地主机。
实例:
package com.lingzhuo.socket; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println(address.getHostName()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
TCP通信
通过例子来说明下面的代码实现的是客户端与服务器的互相通信,从客户端开始,一人一句
//服务器端代码 package com.lingzhuo.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(12345); System.out.println("服务器启动"); Socket socket = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(socket.getOutputStream()); while(true){ String s1 = in.readLine(); System.out.println("客户端说"+s1); String s = br.readLine(); pw.println(s); pw.flush(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //客户端代码 package com.lingzhuo.socket; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MyClient { public static void main(String[] args) { try { Socket socket =new Socket("localhost",12345); System.out.println("客户端启动"); // OutputStreamWriter osw; // osw = new OutputStreamWriter(socket.getOutputStream()); // BufferedWriter out = new BufferedWriter(osw); //上面的三句相当于下面的一句,下面是一层层封装起来,写成一句 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(socket.getOutputStream()); while(true){ String s = br1.readLine(); out.println(s); out.flush(); String s1 = br.readLine(); System.out.println("服务器说"+s1); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果截图
用多线程写TCP通信代码,可以实现服务器与客户端的任意通信,不局限于一次只能发一句
//读操作的线程 package com.lingzhuo.socketThread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class ClientThread implements Runnable { Socket socket; String name; public ClientThread(String name,Socket socket) { // TODO Auto-generated constructor stub this.socket = socket; this.name = name; } @Override public void run() { // TODO Auto-generated method stub BufferedReader br; try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String s1 = br.readLine(); System.out.println(name +"说: "+ s1); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //写操作的线程 package com.lingzhuo.socketThread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ServerThread implements Runnable { Socket socket; public ServerThread(Socket socket) { // TODO Auto-generated constructor stub this.socket = socket; } @Override public void run() { try { BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(socket.getOutputStream()); while (true) { String s = br1.readLine(); out.println(s); out.flush(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //客户端 package com.lingzhuo.socketThread; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { public static void main(String[] args) { try { Socket socket = new Socket("localhost",12345); ClientThread client = new ClientThread("Server",socket); ServerThread server = new ServerThread(socket); Thread t1 = new Thread(client); Thread t2 = new Thread(server); t1.start(); t2.start(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //服务器 package com.lingzhuo.socketThread; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) { ServerSocket server; try { server = new ServerSocket(12345); Socket socket = server.accept(); ClientThread client = new ClientThread("Client",socket); ServerThread serve = new ServerThread(socket); Thread t1 = new Thread(client); Thread t2 = new Thread(serve); t1.start(); t2.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
实验结果
相关文章推荐
- Windows Socket网络编程——第二章 Windows Socket概念
- Redis高可用开源缓存集群方案--总结自网络
- java基础第九讲——反射、工厂设计模式、注解、线程、网络与线程的结合
- 将HttpServletRequest中的参数反射至实体类
- TCP协议中的三次握手和四次挥手(图解)&&TCP/IP 七层网络模型
- ACM hdu5352 最小费用最大流 模板 网络流
- 计算机网络面试题2
- 【linux高级程序设计】(第十四章)TCP高级应用 3
- HTTP请求在网络中的详细过程
- Python socket模拟HTTP请求
- Android中加载网络图片到本地
- TCP三次握手及其背后的缺陷
- TCP三次握手及其背后的缺陷
- 边框圆角化方式(原文链接http://www.cnblogs.com/SJP666/p/4678730.html)
- httpclient +protobuf 实现数据传输
- TCP超时重传机制
- NOI2006 最大获利(网络流)
- TCP粘包的几个有用转载
- 【Android多媒体】NuPlayer for HTTP Live Streaming【5】
- 15/8/3/网络连接,UDP,DOM,SAX,JSON