Java网络编程-学习笔记
服务器:是指提供信息的计算机或程序
客户端:是指请求信息的计算机或程序
编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
使用java.net包中J2SE的API提供接口来解决问题,不用关注通信细节。
java.net 包中提供了两种常见的网络协议的支持:
-
TCP:传输控制协议,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
-
UDP:用户数据报协议,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
Socket 编程
Socket通常称作“套接字”,通常通过“套接字”向网络发出请求或者应答网络请求。
使用可Socket编程步骤:
1、服务器端创建ServerSocket对象,ServerSocket serverSocket = new ServerSocket(port);
2、调用accept方法返回Socket对象,Socket socket = serverSocket.accept();该方法将一直等待,直到客户端连接到服务器上给定的端口。
3、服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
客户端实例化Socket对象,通过端口请求连接到服务器 Socket s = new Socket(ip,port);
4、Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
5、在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,客户端、服务器端都使用Socket中的I/O流,进一步进行数据读写操作。
服务端
public class MyNetDemoServer1 {
int port = 0;
public static void main(String[] args) {
// TODO 自动生成的方法存根
MyNetDemoServer1 s1 = new MyNetDemoServer1();
s1.server();
}
void server()
{
try {
ServerSocket ss = new ServerSocket (8888);
while(true){
Socket sks = ss.accept();
System.out.println("已经接受到客户机:" + sks);
System.out.println("已经接受到客户机:" + sks.getRemoteSocketAddress());
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
客户端
public class MyNetDemoClient1 {
String ip = "";
int port = 0;
String words;
public static void main(String args[]){
MyNetDemoClient1 mc = new MyNetDemoClient1();
mc.connection1(args);
}
void connection1(String args[]){
if (args.length < 3) {
System.out.println("请输入主机地址和端口号,话语");
return ;
}
String ip1 = args[0];
String port1 = args[1] ;
words= args[2] ;
ip = ip1 ;
port = Integer.valueOf(port1) ;
System.out.println(ip);
System.out.println(port);
//链接主机
Socket sk ;
try {
// sk = new Socket("127.0.0.1",port);
sk = new Socket(ip,port);
System.out.println("已经链接主机:" + sk);
OutputStream os = sk.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(os) ;
ow.write(words + "\n");
ow.flush();
ow.close();
sk.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
实现多线程:
服务端:
public static void main(String[] args) {
// TODO 自动生成的方法存根
int port;// 定义服务器端口号
ServerSocket ss;
try {
ss = new ServerSocket(8888);
while (true) {
Socket s = ss.accept();
System.out.println("客户端已经连接");
MyReadEXThread me = new MyReadEXThread();
me.sks = s;
Thread t1 = new Thread(me);
t1.start();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
客户端
public static void main(String[] args) {
// TODO 自动生成的方法存根
String ip;
int port;
if(args.length<2)
{
System.out.println("请输入主机ip和端口号");
return ;
}
ip = args[0];
port = Integer.valueOf((args[1]));
try {
Socket s = new Socket(ip,port);
System.out.println("连接到主机");
InputStream is = s.getInputStream();
FileOutputStream fs = new FileOutputStream("d:/EXnew_" +new Date().getTime()+".jpeg");
byte buffer[] = new byte[128];
while (true) {
int c = is.read(buffer);
if (c < 0) {
break;
}
fs.write(buffer, 0, c);
}
is.close();
fs.flush();
fs.close();
s.close();
} catch (UnknownHostException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
MyReadEXThread
public class MyReadEXThread implements Runnable {
Socket sks;
@Override
public void run() {
// TODO 自动生成的方法存根
OutputStream os;
try {
os = sks.getOutputStream();
FileInputStream fi = new FileInputStream("d:/aaa.jpeg");
byte buffer[] = new byte[128];
while (true) {
int c = fi.read(buffer);
if (c < 0) {
break;
}
os.write(buffer, 0, c);
}
os.flush();
os.close();
fi.close();
sks.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
上一篇: Java笔记 - 网络编程
下一篇: Java学习笔记——网络编程