printPreviewDialog1.PrintPreviewControl.StartPage = 0;
class Composite : Component
{
private List children = new List();
public Composite(string name) : base(name) { }
public override void Add(Component c)
{
children.Add(c);
}
public override void Remove(Component c)
{
children.Remove(c);
}
说点泼冷水的话题
首先确认什么是客户端,什么是服务端。
从用户的角度,可见的、可操作的即是客户端,也就是你这里说的java开发的部分。而不可见的部分就是服务端,也就是你说的C部分。
而从网络开发的角度,发起请求的是客户端,而接收请求的是服务端。这与用户感受有很大区别。
当从java请求C的时候,java是客户端,C 是服务端。而当C主动请求时,则C就变成了客户端,而java 变成了服务端。
所以,从网络开发的角度,java想成为此次通信的服务端,必须长期维护一个端口可用,而C 要访问这个端口。
而java为了能够长期维护一个端口,一般采用socket 方式(其他方式也基本上都是基于socket的),由于java已经封装的很好了,只要new Socket(IP,port) 就可以 获得,同时,由于原来C 是服务器,而如果没有多个服务器同时向java端发送请求的话,基本连线程处理都不需要做的。
class ClientChatThread extends JFrame implements Runnable{
boolean flag=true;
DataInputStream dis;
DataOutputStream dos;
Socket c;
JLabel lSend=new JLabel("请输入要发送的内容");
JTextField txtSendMessage=new JTextField(20);
JButton btnSend=new JButton("发送");
JTextArea txaContent=new JTextArea(10,20);
JPanel p1=new JPanel();
JPanel p2=new JPanel();
public ClientChatThread(Socket c,int num) throws IOException{
super("客户端"+num);
this.c=c;
dis=new DataInputStream(c.getInputStream());
dos=new DataOutputStream(c.getOutputStream());
init();
}
private void init(){
setLayout(new BorderLayout());
p1.setLayout(new FlowLayout());
p1.add(lSend);p1.add(txtSendMessage);p1.add(btnSend);
this.add(p1,BorderLayout.NORTH);
p2.add(txaContent);
this.add(p2,BorderLayout.CENTER);
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
String tmp=txtSendMessage.getText().trim();
txaContent.setText(txaContent.getText()+"客户端说:"+tmp+"\n");
try {
dos.writeUTF(tmp);
txtSendMessage.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("客户端发送信息失败");
}
if(tmp.equals("bye"))
flag=false;
}
});
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(700,500);
this.setVisible(true);
}
public void run(){
String tmp=null;
while(flag){
try {
tmp=dis.readUTF().trim();
this.txaContent.setText(txaContent.getText()+"服务器说:"+tmp+"\n");
if(tmp.equals("bye"))
break;
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("客户端读取信息失败");
flag=false;
}
}
}
}
public class ClientChat {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Socket c1=new Socket("localhost",3000);
ClientChatThread cct1=new ClientChatThread(c1,1);
new Thread(cct1).start();
Socket c2=new Socket("localhost",3000);
ClientChatThread cct2=new ClientChatThread(c2,2);
new Thread(cct2).start();
Socket c3=new Socket("localhost",3000);
ClientChatThread cct3=new ClientChatThread(c3,3);
new Thread(cct3).start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
System.out.println("服务器名找不到");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("连接服务器端失败");
}
}
}