java网络编程Socket学习(一)
2015-05-13 10:32
375 查看
网路协议 |
---|
应用层 |
DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP · RIP |
传输层 |
TCP · UDP · TLS · DCCP · SCTP · RSVP · PPTP · OSPF |
网络层 |
IP (IPv4 · IPv6) · ICMP · ICMPv6· IGMP · IS-IS · IPsec · |
数据链路层 |
Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ARP · RARP · ATM · DTM · 令牌环 · 以太网路 ·FDDI · 帧中继 · GPRS · EVDO ·HSPA · HDLC · PPP · L2TP · ISDN·STP |
物理层 |
以太网路 · 调制解调器 · 电力线通信(PLC) · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线 |
没想到在右边的导航链接里面、看到了这么东西。所以、情不自禁的copy一下。
学习资料:《java 核心技术 卷Ⅱ:高级特性》
由于Windows7的telnet默认情况下是未激活的、要激活它、需要到"控制面板",选择"程序和功能",左边导航的第三个选项"打开或关闭Windows功能",在弹出的窗体中、找到telnet、勾选上后、选择确定。这样就可以激活telnet了。
在命令shell中输入telnet来启动它。
下面利用它来与因特网主机所提供的服务进行通信、例子:
直接输入:telnet time-A.timefreq.bldrdoc.gov 13 返回的是无效指令。
我用的是Windows7 64位操作系统、输入: ?/help 后才知道、需要用open指令
输入:open time-A.timefreq.bldrdoc.gov 13
就会返回一个"当前时间"、”time-A.timefreq.bldrdoc.gov“是服务器名、这台服务器就设在美国科罗拉多州博尔德市的国家标准与技术研究所。
这家研究所负责提供銫原子种的计量时间。你会发现返回的时间好像跟你当前的电脑显示时间相差太多、因为它返回的是美国那边的时间......
13呢、是端口。
下面开始书写我的第一个Socket程序:
[java]view
plaincopyprint?
package com.hzw.socket.test;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;
public class MySocket {
/**
* @param args
*/
public static void main(String[] args) {
try{
Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13); //打开一个套接字
InputStream inS = s.getInputStream(); //获取流对象
Scanner in = new Scanner(inS); //获取流中的数据
while(in.hasNextLine()){
String line = in.nextLine(); //读取数据
System.out.println(line); //打印数据
}
}catch(Exception e){
e.printStackTrace();
}
}
}
打印信息:56172 12-09-02 13:39:17 50 0 0 637.3 UTC(NIST) *
获取服务器的主机名跟因特(IP)地址:
[java]view
plaincopyprint?
package com.hzw.socket;
import java.net.InetAddress;
public class InetAddressTest {
/**
* @param args
*/
public static void main(String[] args) {
try{
/*
* 静态的getByName方法获取某个主机的InetAddress对象
*/
InetAddress addres = InetAddress.getByName("time-A.timefreq.bldrdoc.gov");
System.out.println(addres);
InetAddress Addresses = InetAddress.getLocalHost();//获取本机的InetAddress对象
System.out.println(Addresses);
}catch (Exception e){
e.printStackTrace();
}
}
}
打印信息:time-A.timefreq.bldrdoc.gov/132.163.4.101
pchzw-PC/192.168.0.105
实现服务器:
[java]view
plaincopyprint?
package com.hzw.socket.service;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class MySocketServet {
/**
* @param args
*/
public static void main(String[] args) {
try{
ServerSocket s = new ServerSocket(8189); //创建一个负责监听8189端口的服务
/*
* 等待、直到有客户端连接到这个端口
* 一旦有人通过网络向该端口发送了正确的连接请求、该方法就会返回一个表示连接已经建立的Socket对象
* 可以使用这个对象来得到输入流和输出流
*/
Socket incoming = s.accept();
try{
InputStream inStream = incoming.getInputStream(); //获取输入流
OutputStream outStream = incoming.getOutputStream(); //获取输出流
Scanner in = new Scanner(inStream); //创建扫描器对象
PrintWriter out = new PrintWriter(outStream,true/*autoFlush(自动刷新)*/);
out.println("你好、去吃屎吧!");
boolean bone = false;
while(!bone&&in.hasNextLine()){
String line = in.nextLine();
out.println("Echo:"+line);
//如果输入数据等于BYE、则断开连接、服务器程序也终止运行
if(line.trim().equals("BYE"))bone=true;
}
}catch(Exception e){
e.printStackTrace();
}finally{
incoming.close(); //关闭套接字
}
}catch(Exception e){
e.printStackTrace();
}
}
}
程序写好后、可以用刚刚的第一个程序来访问该服务、也可以使用telnet去访问它。
为多个客户端服务:
[java]view
plaincopyprint?
package com.hzw.socket.service;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class MyServerSocketByThread {
/**
* @param args
*/
public static void main(String[] args) {
try{
int i = 1;
ServerSocket s = new ServerSocket(8189); //创建一个负责监听8189端口的服务
while (true){
/*
* 等待、直到有客户端连接到这个端口
* 一旦有人通过网络向该端口发送了正确的连接请求、该方法就会返回一个表示连接已经建立的Socket对象
* 可以使用这个对象来得到输入流和输出流
*/
Socket incoming = s.accept();
System.out.println("Spawning"+i);
/*
* 启动一个新的线程
*/
Runnable r = new ThreadEchoHandler(incoming);
Thread t = new Thread(r);
t.start();
i++;
}
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
* 实现Runnable接口、与客户端通信代码
*
* @author 古道西风
*
*/
class ThreadEchoHandler implements Runnable{
/**
* 构造方法
* @param i 连接已经建立的Socket对象
*/
public ThreadEchoHandler (Socket i){
incoming = i;
}
public void run() {
try{
try{
InputStream inStream = incoming.getInputStream();
OutputStream ouStream = incoming.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(ouStream,true); //自动刷新
out.println("你去屎吧!");
boolean done = false;
while(!done && in.hasNextLine()){
String line = in.nextLine();
out.println("Echo:"+line);
if(line.trim().equals("好的")) done =true;
}
}finally{
incoming.close(); //关闭Socket
}
}catch(Exception e){
e.printStackTrace();
}
}
private Socket incoming; //声明一个Socket对象、在构造方法中、给该对象赋值
}
可以打开多个telnet窗口进行测试!
相关文章推荐
- 菜猪的JAVA 网络编程学习之Socket用法详解(上)
- 18天Java学习---Java的Socket网络编程以及多线程
- java学习日记(9)———socket,网络编程的学习
- java网络编程Socket学习(一)
- java网络编程Socket学习(一)
- java网络编程Socket学习(二)
- java网络编程Socket学习(二)
- [零散篇]Java学习笔记---Java的Socket网络编程以及多线程
- Java 网络编程 学习笔记二 Socket 用法
- JAVA学习笔记(网络编程 之 socket)
- 黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)
- Java网络编程学习笔记(3)ServerSocket用法详解
- java网络编程---socket用法详解(学习心得)
- Java学习之网络编程--InetAddress,InetSocketAddress
- java网络编程学习笔记(三):ServerSocket详解
- [零散篇]Java学习笔记---Java的Socket网络编程以及多线程
- java网络编程Socket学习(二)
- Java网络编程学习笔记(六)服务器Socket
- 【幻化万千戏红尘】qianfengDay23-java基础学习:网络编程、TCP IP协议、端口Socket、ServerSocket
- 【Java学习笔记】23.网络编程--Socket