一、基础知识

1. TCP状态转换知识,可参考:

http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html

2. 数据传输

3. TCP/IP五层模型

            应用层:HTTP、FTP、SMTP、Telnet等
            传输层: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编程的更多相关文章

  1. <转>Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  2. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

  3. Go语言TCP Socket编程

      Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的 ...

  4. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  5. TCP socket 编程

    TCP socket 编程 讲一下 socket 编程 步骤 使用 socket 模块 建立 TCP socket 客户端和服务端 客户端和服务端之间的通信 图解 编程 举个例子 tcp_server ...

  6. 【转】java的socket编程

    转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...

  7. 基于java的socket编程

    #开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...

  8. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  9. Java笔记 - Socket编程

    两个Java应用程序可以通过一个双向的网络通讯连接实现数据交换,这个双向链路的一端称为一个Socket.java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向链路的c ...

随机推荐

  1. 《Python高效开发实战》实战演练——内置Web服务器4

    <Python高效开发实战>实战演练——开发Django站点1 <Python高效开发实战>实战演练——建立应用2 <Python高效开发实战>实战演练——基本视图 ...

  2. 批处理+组策略 实现规定时间段无法开机and定时关机

    某爱熬夜的人对付自己的东西 1.shutdown命令 shutdown -a #取消现有的shutdown计划 shutdown -s -t [time] #设定时间关机 shutdown -r -t ...

  3. java 报表到excel

    现加个jar包 http://pan.baidu.com/s/1boe5kXh   vfp8 然后代码 package makeReportToExcel; import java.io.File; ...

  4. 【顶】在node环境下玩转less

    1.先搭建node.js环境 具体步骤请点我 2.运行node.js环境 唤出dos窗口→进入工程目录→输入 →成功运行 3.关于less

  5. CFRound#379(div2)

    题目链接:http://codeforces.com/contest/734 A:SB题. #include<cstdio> #include<cstring> #includ ...

  6. Git提交到多个远程仓库

    在已经习惯使用git同步写代码,github无疑是最的托管平台,但是国内由于"你懂的"原因,速度很慢,有时无法访问,于是想把自己的代码同步到多个不同的远程仓库备份. 我的主要仓库: ...

  7. Reprint: Serialization

    Having just recently ran into some major serialization issues I’m going to list some of the errors a ...

  8. 又遇Release编译的一坑 -- 应用程序正常初始化(0xc000007b)失败。请单击“确定”,终止应用程序。

    项目中使用了xlslib库,以动态库形式编译,由于它没有生成链接库lib文件,所以官方提供的demo中有createDLL这个小程序用来生成lib文件.然而我又 no zuo no die了一次.   ...

  9. iScroll 下 a 标签失效

    遇到个莫名其妙的问题,iScroll 下的 a 标签点击没有反应了,不管怎么调整 z-index 都无效果,很是无语. 查找半天后找到解决方法: $(function(){ new IScroll(' ...

  10. JDK根目录介绍

    /bin 存放可执行程序(编译器javac.exe 运行器java.exe 文档生成器javadoc.exe等 ). /db  小型数据库文件. /jre JRE. /include 形成jdk的c. ...