一、Java网络编程原理

二、代码实现(半双工)
客户端程序
/**
* 这是一个客户端程序,可以连接服务器端
*/
package com.test;
import java.net.*;
import java.io.*;
public class MyClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClient mcl=new MyClient();
}
public MyClient()
{
try {
//Socket,就是连接某个服务器端,127.0.0.1表示服务器的Ip 9999表示端口号
Socket s=new Socket("127.0.0.1", 9999);
//如果s连接成功, 就可以发数据给服务器
//我们通过pw 向s写数据 true表示刷新流
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你好吗?我是客户端");
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader (isr);
//行读取
String response=br.readLine();
System.out.println("客户端已经收到,"+response);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
服务器端程序:
/**
* 这是第一个服务器端程序,让它9999端口监听
* 可以接收从客户端发来的信息
*/
package com.test1;
import java.net.*;
import java.io.*;
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyServer msl=new MyServer();
}
public MyServer()
{
try {
//在9999号端口监听
ServerSocket ss=new ServerSocket(9999);
System.out.println("我是服务器,我正在监听");
//等待摸个客户来连接,该函数会返回一个Scokey连接
Socket s=ss.accept();
//要读取s中传递的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader (isr);
//行读取
String info=br.readLine();
System.out.println("服务器已经收到,"+info);
PrintWriter pw=new PrintWriter(s.getOutputStream(), true);
pw.println("你好吗,我是服务器");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
三、改进代码((有聊天界面)使客户端和服务器端能够多次通讯(半双工))
客户端程序:
/**
* 客户端
*
*/
package com.test2;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class MyClient3 extends JFrame implements ActionListener{
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JScrollPane jsp=null;
JPanel jp1=null;
PrintWriter pw=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClient3 ms=new MyClient3();
}
public MyClient3()
{
jta=new JTextArea();
jsp=new JScrollPane(jta);
jtf=new JTextField(10);
jb=new JButton("发送");
jb.addActionListener(this);
jp1=new JPanel();
jp1.add(jtf);
jp1.add(jb);
this.add(jsp,"Center");
this.add(jp1, "South");
this.setTitle("qq简易聊天,客户端");
this.setSize(300,200);
this.setVisible(true);
try {
Socket s=new Socket("127.0.0.1", 9999);
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(), true);
while(true)
{
//不停的读从服务器发来的信息
String info=br.readLine();
jta.append("服务器对客户端说"+info+"\r\n");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getSource()==jb)
{
//把服务器jtf写的内容发送给客户端
String info=jtf.getText();
//把客户发送的信息显示到jta
jta.append("客户端对服务器端说"+info+"\r\n");
pw.println(info);
//清空发送框的内容
jtf.setText("");
}
}
}
服务器端:
/**
* 服务器端
*
*/
package com.test1;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class MyServer3 extends JFrame implements ActionListener{
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JScrollPane jsp=null;
JPanel jp1=null;
//把信息发给客户端的对象
PrintWriter pw=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyServer3 ms=new MyServer3();
}
public MyServer3()
{
jta=new JTextArea();
jsp=new JScrollPane(jta);
jtf=new JTextField(10);
jb=new JButton("发送");
jb.addActionListener(this);
jp1=new JPanel();
jp1.add(jtf);
jp1.add(jb);
this.add(jsp,"Center");
this.add(jp1, "South");
this.setTitle("qq简易聊天,服务器端");
this.setSize(300,200);
this.setVisible(true);
//服务器监听
try {
ServerSocket ss=new ServerSocket(9999);
//等待客户的连接
Socket s=ss.accept();
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(), true);
//从客户端来读取信息
while(true)
{
//读取从客户端发来的信息
String info=br.readLine();
jta.append("客户对服务器说 "+info+"\r\n");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
;
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//如果按下了发送按钮
if(arg0.getSource()==jb)
{
//把服务器jtf写的内容发送给客户端
String info=jtf.getText();
jta.append("服务器对客户端说: "+info+"\r\n");
pw.println(info);
//清空发送框的内容
jtf.setText("");
}
}
}