※ 构建服务器端
※固定格式:ServerSocket server=new ServerSocket(端口号);
※java.net.ServerSocket类
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
一般我们使用第二种构造方法,建立一个有端口号的服务器,便于链接。
package com.briup.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import com.sun.corba.se.spi.orbutil.fsm.Input;
/*
* java.net.*
* java.io.*
* java.lang.* Thread Runable
*/
public class Server {
public static void main(String[] args) {
//构建服务器端
try {
ServerSocket server=new ServerSocket(8888);
//监听是否有客户端链接上来
//accept()调用该方法会处于阻塞状态,当有客户端链
//接上来的返回一个网络套接字Socket对象
//Socket封装了网络输入和输出的字节流
while(true){
Socket socket=server.accept();
//获取输入流
InputStream is=socket.getInputStream();
byte[] b=new byte[1024];
int len=is.read(b);
System.out.println(new String(b,0,len));
//获取输出流
OutputStream os=socket.getOutputStream();
os.write("你好:客户端".getBytes());
os.flush();
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
※ 构建客户端
※ 固定格式:Socket socket=new Socket(服务器IP, 端口prot);
※java.net.Socket类
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
※ 类中常用方法:
void bind(SocketAddress bindpoint)
将套接字绑定到本地地址。
void close()
关闭此套接字。
void connect(SocketAddress endpoint)
将此套接字连接到服务器。
void connect(SocketAddress endpoint, int timeout)
将此套接字连接到服务器,并指定一个超时值。
SocketChannel getChannel()
返回与此数据报套接字关联的唯一 SocketChannel 对象(如果有)。
InetAddress getInetAddress()
返回套接字连接的地址。
InputStream getInputStream()
返回此套接字的输入流。
boolean getKeepAlive()
测试是否启用 SO_KEEPALIVE。
InetAddress getLocalAddress()
获取套接字绑定的本地地址。
int getLocalPort()
返回此套接字绑定到的本地端口。
SocketAddress getLocalSocketAddress()
返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。
boolean getOOBInline()
测试是否启用 OOBINLINE。
OutputStream getOutputStream()
返回此套接字的输出流。
int getPort()
返回此套接字连接到的远程端口。
int getReceiveBufferSize()
获取此 Socket 的 SO_RCVBUF 选项的值,该值是平台在 Socket 上输入时使用的缓冲区大小。
SocketAddress getRemoteSocketAddress()
返回此套接字连接的端点的地址,如果未连接则返回 null。
boolean getReuseAddress()
测试是否启用 SO_REUSEADDR。
int getSendBufferSize()
获取此 Socket 的 SO_SNDBUF 选项的值,该值是平台在 Socket 上输出时使用的缓冲区大小。
int getSoLinger()
返回 SO_LINGER 的设置。
int getSoTimeout()
返回 SO_TIMEOUT 的设置。
boolean getTcpNoDelay()
测试是否启用 TCP_NODELAY。
int getTrafficClass()
为从此 Socket 上发送的包获取 IP 头中的流量类别或服务类型。
boolean isBound()
返回套接字的绑定状态。
boolean isClosed()
返回套接字的关闭状态。
boolean isConnected()
返回套接字的连接状态。
boolean isInputShutdown()
返回是否关闭套接字连接的半读状态 (read-half)。
boolean isOutputShutdown()
返回是否关闭套接字连接的半写状态 (write-half)。
void sendUrgentData(int data)
在套接字上发送一个紧急数据字节。
void setKeepAlive(boolean on)
启用/禁用 SO_KEEPALIVE。
void setOOBInline(boolean on)
启用/禁用 OOBINLINE(TCP 紧急数据的接收者) 默认情况下,此选项是禁用的,即在套接字上接收的 TCP 紧急数据被静默丢弃。
void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
设置此套接字的性能偏好。
void setReceiveBufferSize(int size)
将此 Socket 的 SO_RCVBUF 选项设置为指定的值。
void setReuseAddress(boolean on)
启用/禁用 SO_REUSEADDR 套接字选项。
void setSendBufferSize(int size)
将此 Socket 的 SO_SNDBUF 选项设置为指定的值。
static void setSocketImplFactory(SocketImplFactory fac)
为应用程序设置客户端套接字实现工厂。
void setSoLinger(boolean on, int linger)
启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。
void setSoTimeout(int timeout)
启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。
void setTcpNoDelay(boolean on)
启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。
void setTrafficClass(int tc)
为从此 Socket 上发送的包在 IP 头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。
void shutdownInput()
此套接字的输入流置于“流的末尾”。
void shutdownOutput()
禁用此套接字的输出流。
String toString()
将此套接字转换为 String。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
package com.briup.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
//ip
//localhost 本机
//127.0.0.1 本机
//网络给你分配的ip (window查询ipconfig linux ifconfig)
//构建客户端
//第一个参数ip
//第二个参数端口 int 范围0~65535
Socket socket=null;
try {
socket=new Socket("localhost", 8888);
//获取网络输出流
OutputStream os=socket.getOutputStream();
os.write("你好:服务器".getBytes());
os.flush();
//获取输入流
InputStream is=socket.getInputStream();
byte b[]=new byte[1024];
//read方法会处于阻塞,服务器把消息发过来之后不在阻塞
int len=is.read(b);
System.out.println(new String(b,0,len));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(socket!=null)socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
※ 网络流 socket.getInputStream & socket.getOutputStream
网络传输(网络流)java.io中那些流可以用
DataInputStream
DataOutputStream
BufferedInputStream
BufferedOutputStream
ObjectInputStream
ObjectOutputStream
SequenceInputStream
BufferedReader(inputStreamReader)
BufferedWriter(OutputStreamWriter)
printWriter