02--Java TCP Socket编程
一、基础知识
1. TCP状态转换知识,可参考:
http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html
2. 数据传输
3. TCP/IP五层模型
4. 常用类,java.net.*
此包下主要类结构图如下:
4.1 InetAddress
InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。 该类没有构造方法,由于涉及DNS解析,该类一般用单例模式。
1 //获取本机的InetAddress实例
2 InetAddress address =InetAddress.getLocalHost();
3 address.getHostName();//获取计算机名
4 address.getHostAddress();//获取IP地址
5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分
6
7 //获取其他主机的InetAddress实例
8 InetAddress address2 =InetAddress.getByName("其他主机名");
9 InetAddress address3 =InetAddress.getByName("IP地址");
4.2 URL类
URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址,协议名:资源名称
1 //创建一个URL的实例
2 URL baidu =new URL("http://www.baidu.com");
3 URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点
4 url.getProtocol();//获取协议
5 url.getHost();//获取主机
6 url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
7 url.getPath();//获取文件路径
8 url.getFile();//文件名,包括文件路径+参数
9 url.getRef();//相对路径,就是锚点,即#号后面的内容
10 url.getQuery();//查询字符串,即参数
4.3 Socket类
代表通讯过程中的客户端。
4.4 ServerSocket类
代表通讯过程中的服务器端。
二、Socket编程模型及步骤
1. Socket模型图
2. ServerSocket工作步骤
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求,此处会堵塞。
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
3. Socket工作步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
三、常用工作模型
1. 服务器单线程监听和处理服务,客户端单线程,2个文件
package com.yyn.io.net; import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Date; public class SingleThreadServer extends Thread{
/**
* 单线程的,仅仅是能够应答连接的客户就立即断开连接了
*/
private static ServerSocket serverSocket; public SingleThreadServer(){
super();
try{
serverSocket = new ServerSocket(1112);
System.out.println("SingleThreadSocket creating....");
}catch (Exception e) {
System.out.println("SingleThreadSocket create failed....");
System.exit(1);
}
} @Override
public void run() {
// TODO Auto-generated method stub
Socket client = null;
while (true) {
if (serverSocket == null) {
return;
}
try{
client = serverSocket.accept();
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
PrintWriter writer = new PrintWriter(bos);
Date now = new Date(System.currentTimeMillis());
writer.write(now.toString());
System.out.println("New Connection Accepted:"+client.getRemoteSocketAddress());
writer.flush();
client.close(); }catch (Exception e) {
// TODO: handle exception
}
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
SingleThreadServer server = new SingleThreadServer();
server.start();
}
}
package com.yyn.io.net; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.Buffer; public class SingleThreadClient { public static void main(String[] args) throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Socket server = new Socket("127.0.0.1", 1112);
OutputStream out = server.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
PrintWriter writer = new PrintWriter(bos);
writer.write("Hello server!!!"); InputStream in = server.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(isr);
String info = null;
info = reader.readLine();
System.out.println("####Server Message: " + info); reader.close();
isr.close();
in.close();
writer.close();
bos.close();
out.close();
server.close(); } }
2. 服务器单线程监听,连接客户端后(ACCEPT成功后),启动新线程处理服务。
package com.yyn.io.net; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; //获取用户连接请求,请求成功后,调用MultiThreadSeverThread进行服务
public class MultiThreadServerReceiver { public static final int PORT = 12002; public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
init();
} public static void init() throws Exception{
ServerSocket server = new ServerSocket(PORT);
System.out.println("Server is started");
int count = 0;
while(true){
Socket client = server.accept();
System.out.println("Accepted at: " + client.getRemoteSocketAddress());
MultiThreadSeverThread serverThread = new MultiThreadSeverThread(client);
System.out.println("Start Thread to process!!!");
serverThread.start();
count++;
while (count >=3) {
return;
}
}
} }
package com.yyn.io.net; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket; //请求连接后,accept成功后,负责服务的线程类
public class MultiThreadSeverThread extends Thread{
private Socket client = null;
private PrintWriter writer = null;
private BufferedReader reader = null;
public static final String CHARSET = "UTF-8"; public MultiThreadSeverThread(Socket client) throws Exception{
this.client = client;
try{
// Init writer
OutputStreamWriter osw = new OutputStreamWriter(client.getOutputStream(),CHARSET);
BufferedWriter bw = new BufferedWriter(osw);
this.writer = new PrintWriter(bw); // Init reader
InputStreamReader isr = new InputStreamReader(client.getInputStream(),CHARSET);
this.reader = new BufferedReader(isr);
}catch(Exception e){
e.printStackTrace();
throw new Exception("Init MultiThreadServerThread failed!!!");
}
System.out.println("#######Welcome to server,input commands please!!!");
} @Override
public void run(){
String command = null;
boolean flag = true;
System.out.println("thread to process!!!");
while (flag) {
try {
command = this.reader.readLine();
System.out.println("client command:" + command);
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
if (command == null) {
return ;
}
// if command is not null ,then trim it and change to upper case
command = command.trim().toUpperCase();
if(command.equals("QUIT")){
flag = false;
}else if (command.equals("HELP")) {
this.writer.println("本服务器可收到的请求有:");
this.writer.println("list");
this.writer.println("push");
this.writer.println("pop");
}else if(command.equals("LIST") || command.equals("PUSH") || command.equals("POP")) {
this.writer.println("输入命令正确");
}else{
this.writer.println("输入命令有误,请重新输入!!!");
}
writer.flush();
}
// close socket connection
try {
this.client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.yyn.io.net; import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.stream.Stream; public class MultiThreadServerClient { public static final int PORT = 12002; public static void main(String[] args) throws UnknownHostException, IOException {
// TODO Auto-generated method stub
Socket socket = new Socket("127.0.0.1",PORT);
// in stream from console
InputStreamReader isr = new InputStreamReader(System.in,"UTF-8");
BufferedReader in = new BufferedReader(isr);
// out stream from socket
OutputStreamWriter osw =
new OutputStreamWriter(new BufferedOutputStream(socket.getOutputStream()), "UTF-8");
PrintWriter out = new PrintWriter(osw); String command = null;
while(true){
System.out.println("#######################");
command = in.readLine();
if (command == null) {
socket.shutdownInput();
break;
}
command = command.trim().toUpperCase();
if (command.equals("EXIT")) {
socket.shutdownInput();
break;
}
out.println(command); //必须用println方法,不能用write,否则服务端无法获取数据,会堵塞
out.flush();
System.out.println("data send to server:"+command);
}
} }
3. 服务器一次向多个客户端发送信息
02--Java TCP Socket编程的更多相关文章
- <转>Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
- Go语言TCP Socket编程
Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的 ...
- java tcp socket实例
java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...
- TCP socket 编程
TCP socket 编程 讲一下 socket 编程 步骤 使用 socket 模块 建立 TCP socket 客户端和服务端 客户端和服务端之间的通信 图解 编程 举个例子 tcp_server ...
- 【转】java的socket编程
转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...
- 基于java的socket编程
#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- Java笔记 - Socket编程
两个Java应用程序可以通过一个双向的网络通讯连接实现数据交换,这个双向链路的一端称为一个Socket.java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向链路的c ...
随机推荐
- zabbix 布署实践【7 H3C网络设备监控模版制作思路】
我们知道,zabbix安装后自带Template OS Linux 模版已满足了绝大部分Linux服务器的基础环境监控,只是我们在其模版上稍微修改,可配合将SWAP监控取消,另存为一个叫OS Linu ...
- SAP CRM 为用户创建业务合作伙伴并分配到组织单位
想要在SAP CRM的前台完成一些操作,需要登录的用户在系统中存在对应的业务合作伙伴才可以,某些情况下,还需要被分配到正确的公司.部门.职位.下面是相关的操作步骤. 本文假定读者已经拥有一个开发帐号. ...
- Apache Tomcat部署java web项目
本教程安装环境为windows服务器 在服务器中下载安装JDK JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...
- 【锋利的Jquery】读书笔记七
第七章 jquery插件 管理cookie的插件--cookie jquery插件太多没什么好讲的,百度太多 说以下 cookie插件 <!DOCTYPE html> <html& ...
- jxl 导入excel
jsp部分 <div class="modal-dialog"> <div class="modal-content"> <div ...
- C# 利用ajax实现局部刷新
C#所有runat="server"的控件都会造成整个界面的刷新,如果想实现局部刷新,可以利用ajax. 需要加入的控件有ScriptManager和UpdatePanel,可以实 ...
- weak引用变量是否线程安全
1.在ARC出现之前,Objetive-C的内存管理需要手工执行release&retain操作,这些极大增加了代码的编写难度,同时带来很多的crash. 同时大量的delegate是unr ...
- [转]RadStudio DELPHI/C++ BUILDER Berlin 10.1 Update2安装破解教程
源链接:http://bbs.fishc.com/thread-76730-1-1.html 免责声明:本教程所有资源均为学习交流之用,软件和资料版权归原开发公司所有,请于下载后24小时内删除,禁止用 ...
- Linux学习初步
centOS 6.5关闭防火墙步骤 关闭命令: service iptables stop 永久关闭防火墙:chkconfig iptables off两个命令同时运行,运行完成后 ...
- html css jquery 回到顶部按钮
今天做了个回到顶部的功能,在这里记录一下,有需要可以拿去试试! CSS部分,很简单就一个class /*回到顶部*/ .back-top { position: fixed; right: 15px; ...